📅  最后修改于: 2023-12-03 15:11:15.717000             🧑  作者: Mango
这个 Javascript 程序集可以帮助你克隆一个链表,这个链表除了 next
指针还有一个 random
指针。它可以快速轻松地处理这种复杂的数据结构。
这个程序的思路非常简单。它分成了两个步骤:
random
指针这个程序最重要的地方在于第二步,我们需要找到每个新节点对应的原始节点的 random
指针指向的节点。因此,我们需要一种方法来将新节点映射回原始节点。我们可以使用一个 HashMap 来做到这一点。键是新节点,值是对应的原始节点。
下面是完整的 Javascript 程序集,包括注释以及详细的代码解释:
/**
* Definition for a Node.
* function Node(val,next,random) {
* this.val = val;
* this.next = next;
* this.random = random;
* };
*/
/**
* @param {Node} head
* @return {Node}
*/
var copyRandomList = function(head) {
const map = new Map();
let cur = head;
// Step 1: Make copy of each node
while (cur !== null) {
const node = new Node(cur.val, null, null);
map.set(cur, node);
cur = cur.next;
}
// Step 2: Connect the copied nodes
cur = head;
while (cur !== null) {
const node = map.get(cur);
node.next = map.get(cur.next) || null;
node.random = map.get(cur.random) || null;
cur = cur.next;
}
return map.get(head);
};
这个程序的时间复杂度为 O(n),其中 n 是链表的长度。这是因为我们需要遍历原始链表两次:一次是在第一步中复制每个节点,另一次是在第二步中为新节点设置 random
指针。另外,我们还需要将每个新节点和对应的原始节点存储在 HashMap 中,这需要 O(n) 的空间复杂度。这个程序的性能足以处理大多数实际问题。