提神醒脑!!! 
【描述】:
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。 构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。
返回复制链表的头节点。
示例1:  示例2:  示例3:  【分析】: 第一步:将各个节点拷贝下来链接在原节点后面。 第二步:链接拷贝节点的random,而拷贝节点的random就指向原节点random所指向的节点的下一个节点。这里我们拿拷贝的13节点为例:  然后依次类推,所有的拷贝节点的random所指的位置均有上述思想来确定。 
第三步:把拷贝节点解下来,链接在一起,组成赋值链表。
代码:
struct Node* copyRandomList(struct Node* head) {
struct Node * cur = head;
while(cur){
struct Node * copy = (struct Node*)malloc(sizeof(struct Node));
copy->val = cur->val;
copy->next = cur->next;
cur->next = copy;
cur = copy->next;
}
cur = head;
while(cur){
if(cur->random == NULL){
cur->next->random = NULL;
}
else{
cur->next->random = cur->random->next;
}
cur = cur->next->next;
}
struct Node * copyHead, *copyTail;
copyHead = copyTail = NULL;
cur = head;
while(cur){
struct Node * copy = cur->next;
struct Node * Next = copy->next;
cur->next = Next;
if(copyTail == NULL){
copyHead = copyTail = copy;
}
else{
copyTail->next = copy;
copyTail = copyTail->next;
}
cur = Next;
}
return copyHead;
}
|