138. Copy List with Random Pointer
/*
// 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) {
for(Node* p = head; p; ) {
Node* q = new Node(p->val);
q->next = p->next;
p->next = q;
p = q->next;
}
for(Node* p = head; p && p->next; p = p->next->next) {
if(p->random) p->next->random = p->random->next;
}
Node* newHead = new Node(0), *q, *t;
Node* new_p = newHead;
for(Node* p = head; p; ) {
q = p->next; // 刚刚复制的节点,准备拼接到newHead
t = q->next; // 记录下一次的 p
q->next = NULL;
new_p->next = q;
new_p = q; // 更新 new_p
p->next = t;
p = t; // 更新 p
}
return newHead->next;
}
};