本文主要是介绍【leetcode100-032】【链表/回溯/哈希】随机链表的复制,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
【题干】
给你一个长度为 n
的链表,每个节点包含一个额外增加的随机指针 random
,该指针可以指向链表中的任何节点或空节点。
构造这个链表的 深拷贝。 深拷贝应该正好由 n
个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next
指针和 random
指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。
例如,如果原链表中有 X
和 Y
两个节点,其中 X.random --> Y
。那么在复制链表中对应的两个节点 x
和 y
,同样有 x.random --> y
。
返回复制链表的头节点。
用一个由 n
个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index]
表示:
val
:一个表示Node.val
的整数。random_index
:随机指针指向的节点索引(范围从0
到n-1
);如果不指向任何节点,则为null
。
你的代码 只 接受原链表的头节点 head
作为传入参数。
【思路】
- 对任意未创建的节点,我们先创建它的拷贝;
- 然后我们对它的后继节点和随机指针指向的节点进行检查,若不存在则也创建拷贝,同时递归的回到第一步,直到某节点的后继指针和随机指针都指向了已创建节点,并从表中取出了它们的指针,完成了自己两个变量的赋值后才退出当前层次;
- 如何避免重复创建呢?我们用哈希表记录每一个节点的拷贝节点的创建情况,当它被创建时,记录其指针,而当有节点的后继是它时,我们可以方便快速的从表中取出其指针;
- 如此循环直到链表走到末尾,就可以确保所有链上节点都已经完成自身、next指针、随机指针三者的拷贝啦!
【题解】
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];}
};
这篇关于【leetcode100-032】【链表/回溯/哈希】随机链表的复制的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!