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
/**
* Definition for singly-linked list with a random pointer.
* struct RandomListNode {
* int label;
* RandomListNode *next, *random;
* RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
* };
*/
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
h = NULL;
map<RandomListNode *,RandomListNode *> m;
RandomListNode *rear=NULL,*q=head;
while(q){
RandomListNode *p = createNode(q);
m[q]=p;
if(h==NULL) h=p;
else rear->next = p;
rear = p;
q=q->next;
}
q=head;
while(q){
m[q]->random=m[q->random];
q=q->next;
}
return h;
}
~Solution(){
while(h){
RandomListNode *p=h;
h=h->next;
free(p);
}
}
private:
RandomListNode *createNode(RandomListNode *q){
RandomListNode *p = new RandomListNode(q->label);
return p;
}
private:
RandomListNode *h;
};