题目描述:
请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null
链接:https://leetcode.cn/problems/fu-za-lian-biao-de-fu-zhi-lcof
知识点:回溯,哈希,深拷贝
![](https://img-blog.csdnimg.cn/img_convert/2ade9bcc0faeb3c2e738a9736e2ba006.png)
注意:
本题中因为随机指针的存在,当我们拷贝节点时,当前节点的随机指针指向的节点 可能还没创建
思路:
我们利用回溯的方式,让每个节点的拷贝操作相互独立。对于当前节点,我们首先要进行拷贝,然后我们进行「当前节点的后继节点」和「当前节点的随机指针指向的节点」拷贝,拷贝完成后将创建的新节点的指针返回,即可完成当前节点的两指针的赋值。
class Solution {
public:
unordered_map<Node*, Node*> cachedNode;
Node* copyRandomList(Node* head) {
if (head == nullptr) {
return nullptr;
}
if (!cachedNode.count(head)) {
Node* headNew = new Node(head->val);
cachedNode[head] = headNew;
headNew->next = copyRandomList(head->next);
headNew->random = copyRandomList(head->random);
}
return cachedNode[head];
}
};