题目描述:
给定一个链表,每个节点包含一个额外增加的随机指针,这个指针可以指向链表中的任意节点包括自身和NULL。
要求返回这个链表的深拷贝
分析:
复制完原来的链表是可以完成每个节点的next是可以指向下一个节点这个要求的,但是复制只是把值进行了拷贝,每个节点里面的random就找不到原来链表在拷链表中的对应位置,这就达不到深拷贝要求,这才是这个问题的要解决的问题,那么怎么办呢?
其实我们可以这样:
第一步:
第二步:
第三步:
那么最后的功能得以实现
完整代码如下:
/**
* Definition for a Node.
* struct Node {
* int val;
* struct Node *next;
* struct Node *random;
* };
*/
typedef struct Node Node;
struct Node* copyRandomList(struct Node* head) {
if(head==NULL){
return NULL;
}
//1、复制每个节点然后连接到原来节点的后面,得到新的链表
Node* cur = head;
while(cur){
//复制节点
Node* copy = (Node*)malloc(sizeof(Node));
copy->next = NULL;
copy->random=NULL;
copy->val = cur->val;
//连接
Node* next = cur->next;
cur->next = copy;
copy->next=next;
//迭代cur
cur = next;
}
//2、处理每个拷贝节点的random
cur = head;
while(cur){
Node* copy = cur->next;
if(cur->random)
copy->random = cur->random->next;
else
copy->random = NULL;
//更新cur
cur = copy->next;
}
//3、拆解长链表,返回复制链表的头指针。
cur = head;
Node* copyHead = head->next;
while(cur){
Node* copy = cur->next;
Node* next = copy->next;
if(next){
cur->next = next;
copy->next = next->next;
}
else{
cur->next = next;
copy->next=NULL;
}
//迭代cur
cur = next;
}
return copyHead;
}