题目描述:长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点,构造这个链表的深拷贝。深拷贝应该正好由 n 个全新节点成,其中每个新节点的值都设为其对应的原节点的值,复制链表中的指针都不应指向原链表中的节点 。
难点:遍历无法构造random指针指向
方法1:使用哈希表,key->value,映射为原节点->新节点,第一次遍历单纯构建节点,不指定指针,第二次遍历指定指针
如果访问map[key],key不存在,会返回value的默认值,比如value是对象,返回NULL
class Solution {
public:
Node* copyRandomList(Node* head) {
if(!head) return NULL;
unordered_map<Node*,Node*>map;
Node* p = head;
while(p){
map[p] = new Node(p->val);
p = p->next;
}
p = head;
while(p){
map[p]->next = map[p->next];
map[p]->random = map[p->random];
p = p->next;
}
return map[head];
}
};