LeetCode 138. 复制带随机指针的链表
题目描述:
示例:
题目分析:
复制相同链表元素容易,但是使得copy链表的random指针指向和原链表相同就有些麻烦。这里我们提供一种思路:
1.首先在原链表每个节点的后面开辟一个新节点,使得开辟节点的值与原节点值相同,并插入在复制节点的后面,效果如图:
2.接下来就应该是random指针指向相同了,由上图我们不难发现,copy节点的random指向恰好为原节点random指向的节点的next指向,即copy->random = cur->random->next;
3.最后,我们应该做的就是把每个开辟的copy节点解下来,然后链接成一个新的要返回的链表,并且还原原来的链表,效果如下:
上代码:
struct Node* copyRandomList(struct Node* head) {
struct Node*cur = head;
//1.在每个节点后复制相同节点,并插入
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;
}
//2.使random结果一样:copy->random = cur->random->next
cur = head;
while(cur){
struct Node*copy = cur->next;
if(cur->random == NULL){
copy->random = NULL;
}else{
copy->random = cur->random->next;
}
cur = copy->next;
}
//3.copy节点接解下来,链接到一起,还原原链表
cur = head;
struct Node*copyHead = NULL,*copyTail = NULL;
while(cur){
struct Node*copy = cur->next;
struct Node*next = copy->next;
//尾插
if(copyTail == NULL){
copyHead = copyTail = copy;
}else{
copyTail->next = copy;
copyTail = copyTail->next;
}
cur->next = next;
cur = next;
}
return copyHead;
}