#include <iostream>
#include <unordered_map>
using namespace std;
class Node {
public:
int val;
Node* next;
Node* random;
Node(int _val, Node* _next = nullptr, Node* _random = nullptr) {
val = _val;
next = _next;
random = _random;
}
};
class Solution {
public:
Node* copyRandomList(Node* head) {
if (!head)
return nullptr;
unordered_map<Node*, Node*> node_map;
Node* copy_head = nullptr;
Node** copy = ©_head;
Node* node = head;
do {
*copy = new Node(node->val/*, nullptr, nullptr*/);
node_map.insert(make_pair(node, *copy));
copy = &((*copy)->next);
node = node->next;
}
while (node);
node = copy_head;
do {
if (head->random)
node->random = node_map[head->random];
node = node->next;
head = head->next;
}
while (head);
return copy_head;
}
};
void printList(Node *head) {
while (head) {
cout << head << " val=" << head->val << " random=";
if (head->random)
cout << head->random->val << endl;
else
cout << "null";
head = head->next;
}
}
int main() {
Node node1(1);
Node node2(2);
node1.next = &node2;
node1.random = &node2;
node2.random = &node2;
printList(&node1);
cout << endl;
Node *copy = Solution{}.copyRandomList(&node1);
printList(copy);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCmNsYXNzIE5vZGUgewpwdWJsaWM6CglpbnQgdmFsOwoJTm9kZSogbmV4dDsKCU5vZGUqIHJhbmRvbTsKCU5vZGUoaW50IF92YWwsIE5vZGUqIF9uZXh0ID0gbnVsbHB0ciwgTm9kZSogX3JhbmRvbSA9IG51bGxwdHIpIHsKCQl2YWwgPSBfdmFsOwoJCW5leHQgPSBfbmV4dDsKCQlyYW5kb20gPSBfcmFuZG9tOwoJfQp9OwoKY2xhc3MgU29sdXRpb24gewpwdWJsaWM6CglOb2RlKiBjb3B5UmFuZG9tTGlzdChOb2RlKiBoZWFkKSB7CgkJaWYgKCFoZWFkKQoJCQlyZXR1cm4gbnVsbHB0cjsKCgkJdW5vcmRlcmVkX21hcDxOb2RlKiwgTm9kZSo+IG5vZGVfbWFwOwoJCU5vZGUqIGNvcHlfaGVhZCA9IG51bGxwdHI7CgkJTm9kZSoqIGNvcHkgPSAmY29weV9oZWFkOwoJCU5vZGUqIG5vZGUgPSBoZWFkOwoKCQlkbyB7CgkJCSpjb3B5ID0gbmV3IE5vZGUobm9kZS0+dmFsLyosIG51bGxwdHIsIG51bGxwdHIqLyk7CgkJCW5vZGVfbWFwLmluc2VydChtYWtlX3BhaXIobm9kZSwgKmNvcHkpKTsKCQkJY29weSA9ICYoKCpjb3B5KS0+bmV4dCk7CgkJCW5vZGUgPSBub2RlLT5uZXh0OwoJCX0KCQl3aGlsZSAobm9kZSk7CgoJCW5vZGUgPSBjb3B5X2hlYWQ7CgoJCWRvIHsKCQkJaWYgKGhlYWQtPnJhbmRvbSkKCQkJCW5vZGUtPnJhbmRvbSA9IG5vZGVfbWFwW2hlYWQtPnJhbmRvbV07CgkJCW5vZGUgPSBub2RlLT5uZXh0OwoJCQloZWFkID0gaGVhZC0+bmV4dDsKCQl9CgkJd2hpbGUgKGhlYWQpOwoKCQlyZXR1cm4gY29weV9oZWFkOwoJfQp9OwoKdm9pZCBwcmludExpc3QoTm9kZSAqaGVhZCkgewoJd2hpbGUgKGhlYWQpIHsKCQljb3V0IDw8IGhlYWQgPDwgIiB2YWw9IiA8PCBoZWFkLT52YWwgPDwgIiByYW5kb209IjsKCQlpZiAoaGVhZC0+cmFuZG9tKQoJCQljb3V0IDw8IGhlYWQtPnJhbmRvbS0+dmFsIDw8IGVuZGw7CgkJZWxzZQoJCQljb3V0IDw8ICJudWxsIjsKCQloZWFkID0gaGVhZC0+bmV4dDsKCX0KfQoKaW50IG1haW4oKSB7CglOb2RlIG5vZGUxKDEpOwoJTm9kZSBub2RlMigyKTsKCglub2RlMS5uZXh0ID0gJm5vZGUyOwoJbm9kZTEucmFuZG9tID0gJm5vZGUyOwoJbm9kZTIucmFuZG9tID0gJm5vZGUyOwoKCXByaW50TGlzdCgmbm9kZTEpOwoJY291dCA8PCBlbmRsOwoKCglOb2RlICpjb3B5ID0gU29sdXRpb257fS5jb3B5UmFuZG9tTGlzdCgmbm9kZTEpOwoJcHJpbnRMaXN0KGNvcHkpOwoJCQoJcmV0dXJuIDA7Cn0=