复制带随机指针的链表
问题描述
给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的 深拷贝。
我们用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:
val:一个表示 Node.val 的整数。
random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为 null 。
【注】深拷贝:深拷贝是指源对象与拷贝对象互相独立,其中任何一个对象的改动都不会对另外一个对象造成影响。
解题思路
又是没有思路的一天…
最后是根据题解区的思路写出来的:
思路分三步:
①将新结点连接到每个旧结点的后面;
②新结点的random指向旧结点random的next;
③将新结点和旧结点分离成两个链表。
比如例子的步骤一:
代码实现:
/*
// Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val) {
val = _val;
next = NULL;
random = NULL;
}
};
*/
class Solution {
public:
Node* copyRandomList(Node* head) {
if(!head)
return head;
Node* cur = head;
while(cur){ //将新结点加到原链表结点的后面
Node* temp = new Node(cur->val);
Node* q = cur->next;
cur->next = temp;
temp->next = q;
cur = q;
}
cur = head;
Node* new_cur = cur->next;
while(cur){//将新结点的随机指针加上
if(!cur->random)
new_cur->random = NULL;
else
new_cur->random = cur->random->next;
cur = new_cur->next;
if(!cur) break;
new_cur = cur->next;
}
Node* new_head = head->next;
cur = head;
new_cur = new_head;
while(cur && cur->next){ //分离head和new_head
cur->next = new_cur->next;
cur =cur->next;
if(!cur) break;
new_cur->next = cur->next;
new_cur = new_cur->next;
}
return new_head;
}
};