给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求: 返回这个链表的深拷贝。
示例:
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":
{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
/* Definition for a Node.
class Node {
public:
int val;
Node* next;
Node* random;
Node() {}
Node(int _val, Node* _next, Node* _random) {
val = _val;
next = _next;
random = _random;
}
}; */
class Solution {
public:
Node* copyRandomList(Node* head) {
if (!head) return nullptr;
Node* ite = head;
while (ite) { //用next将拷贝链表与原链表连接
Node* n = new Node(ite->val, ite->next, nullptr); //复制原节点的连接关系与数据
Node* c = ite->next;
ite->next = n;
ite = c;
}
ite = head;
while (ite) { //拷贝原链表的random指向
if (ite->random) ite->next->random = ite->random->next;
ite = ite->next->next;
}
ite = head;
Node* ret = head->next;
while (ite->next) { //断开原链表与拷贝链表,next连接拷贝链表
Node* c = ite->next;
ite->next = ite->next->next;
ite = c;
}
return ret;
}
};