------Question------
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.
------Solution------
struct RandomListNode {
int label;
RandomListNode *next, *random;
RandomListNode(int x) : label(x), next(NULL), random(NULL) {}
};
class Solution {
public:
RandomListNode *copyRandomList(RandomListNode *head) {
if(!head) return NULL;
map<RandomListNode *, RandomListNode *> flag;
RandomListNode *root = copyNode(head, flag);
return root;
}
RandomListNode * copyNode(RandomListNode *source, map<RandomListNode *, RandomListNode *> &flag)
{
if(flag.find(source)!=flag.end())
{
return flag[source];
}
RandomListNode *target = new RandomListNode (source->label);
flag[source]=target;
if(source->next)
target->next = copyNode (source->next,flag);
if(source->random)
target->random = copyNode (source->random,flag);
return target;
}
};