A linked list is given such that each node contains an additional random pointer which could point to any node in the list or null.
Return a deep copy of the list.
Example:
Input: head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
Output: [[7,null],[13,0],[11,4],[10,2],[1,0]]
Solution:
/*
// 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 == nullptr)
return head;
Node* p = head;
// 将copy新创建的元素插入到原链表中,形成“Z”字形
while(p)
{
Node* newNode = new Node{p->val};
newNode->next = p->next;
p->next = newNode;
p = p->next->next;
}
p = head;
// copy random指针指向
while(p)
{
if(p->random != nullptr)
{
p->next->random = p->random->next;
}
p = p->next->next;
}
Node dummy{-1};
p = head;
Node* newp = &dummy;
// 分拆两个链表
while(p)
{
newp->next = p->next;
p->next = p->next->next;
p = p->next;
newp = newp->next;
}
return dummy.next;
}
};