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.
/*
思想:
head->p1->p2->p3 for exmpale:head->rand = p2
newHead->newp1->newp2->newp3 should: newHead->rand = newP2
1. map[head] = newHead
map[p1] = newp1
map[p2] = newp2
map[p3] = newp3
2. newHead->rand = map[ head->rand ] = map[p2]= newP2
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
RandomListNode* q = new RandomListNode(0);
RandomListNode* r = q;
RandomListNode* p = head;
map<RandomListNode*,RandomListNode*>mp;
while(head)
{
RandomListNode* temp = new RandomListNode(head->label);
temp->next = head->next;
q->next = temp;
q = q->next;
mp[head] = temp;
head = head->next;
}
head = p;
q = r;
q = q->next;
while(head)
{
q->random = mp[head->random];
head = head->next;
q = q->next;
}
return r->next;
}
};