给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中的任何节点或空节点。
要求返回这个链表的深拷贝。
输入:
{"$id":"1","next":{"$id":"2","next":null,"random":{"$ref":"2"},"val":2},"random":{"$ref":"2"},"val":1}
解释:
节点 1 的值是 1,它的下一个指针和随机指针都指向节点 2 。
节点 2 的值是 2,它的下一个指针指向 null,随机指针指向它自己。
提示:
你必须返回给定头的拷贝作为对克隆列表的引用。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/copy-list-with-random-pointer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
A//先将原来链表的每个节点追加一份副本
B//为副本复制random指针
C//拆分链表,将原节点和副本节点拆开
class Solution {
private:
void extendLinkList(Node* &head) {
if(!head)
return;
Node* p = head;
while(p){
Node* r = new Node;
r->val = p->val;
r->next = p->next;
p->next = r;
p = p->next->next;
}
}
void putRandomPtr(Node* &head) {
if(!head)
return;
Node* p = head;
while(p) {
if(p->random)
p->next->random = p->random->next;
else
p->next->random = nullptr;
p = p->next->next;
}
}
Node* splitLinkList(Node* head) {
if(!head)
return nullptr;
Node* newHead = head->next;
Node* p = newHead;
Node* q = head;
while(1) {
q->next = p->next;
q = q->next;
if (!q)
break;
p->next = q->next;
p = p->next;
}
return newHead;
}
public:
Node* copyRandomList(Node* head) {
if(head == nullptr)
return nullptr;
extendLinkList(head); //先将原来链表的每个节点追加一份副本
putRandomPtr(head); //为副本复制random指针
return splitLinkList(head); //拆分链表,将原节点和副本节点拆开
}
};