/*
// 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){
return NULL;
}
map<Node *, int> pointToPos;
vector<Node *> v;
Node * q = copyNode(head);
pointToPos.insert(make_pair(head, 0));
v.push_back(q);
int i = 1;
Node *p = head->next;
while(p){
pointToPos.insert(make_pair(p, i));
v.push_back(copyNode(p));
p = p->next;
i++;
}
p = head;
i = 0;
while(p){
if (p->random){
int k = pointToPos.find(p->random)->second;
v[i]->random = v[k];
}
i++;
p = p->next;
}
Node * r = q = v[0];
for(i = 1; i<v.size(); i++){
q->next = v[i];
q = q->next;
}
return r;
}
Node *copyNode(Node *node){
Node * tnode = new Node(node->val);
tnode->next = NULL;
tnode->random = NULL;
return tnode;
}
};