📌  相关文章
📜  用于克隆具有下一个和随机指针的链接列表的 Javascript 程序集 2(1)

📅  最后修改于: 2023-12-03 15:11:15.717000             🧑  作者: Mango

用于克隆具有下一个和随机指针的链接列表的 Javascript 程序集 2

这个 Javascript 程序集可以帮助你克隆一个链表,这个链表除了 next 指针还有一个 random 指针。它可以快速轻松地处理这种复杂的数据结构。

程序思路

这个程序的思路非常简单。它分成了两个步骤:

  1. 遍历原始链表,将每个节点复制一份,并将新节点插入到对应原始节点的后面
  2. 遍历新链表,为它的每个节点设置 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) 的空间复杂度。这个程序的性能足以处理大多数实际问题。