题目
剑指 Offer 35. 复杂链表的复制 - 力扣(LeetCode)
https://leetcode-cn.com/problems/fu-za-lian-biao-de-fu-zhi-lcof/
解析
通过next复制链表比较容易,
题目难在怎么关联random指针,我们可以通过map保存原节点到新节点的映射关系,通过访问原节点的random来获取对应的新节点
HashMap
class Solution {
public:
Node* copyRandomList(Node* head) {
if(head == nullptr) return nullptr;
Node* cur = head;
unordered_map<Node*, Node*> map;//index 为原节点,value为新节点
// 复制各节点,并建立 “原节点 -> 新节点” 的 Map 映射
while(cur != nullptr) {
map[cur] = new Node(cur->val);
cur = cur->next;
}
cur = head;
// 构建新链表的 next 和 random 指向
while(cur != nullptr) {
//通过原节点访问新节点,并完成映射
map[cur]->next = map[cur->next];
map[cur]->random = map[cur->random];
//欲遍历所有节点~~~
cur = cur->next;
}
// 返回新链表的头节点
return map[head];
}
};