【复杂链表的复制】【JavaScript解法】

思路

用一个哈希表表示映射关系:键是原节点,值是复制的节点。

整体算法流程是:

  • 第一次遍历,复制每个节点和 next 指针,并且保存“原节点-复制节点”的映射关系
  • 第二次遍历,通过哈希表获得节点对应的复制节点,更新 random 指针

代码实现

使用 ES6 的Map,可以直接将对象作为键值。

JavaScript 代码实现:

// ac地址:https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba
// 原文地址:https://xxoo521.com/2020-02-05-link-copy/

// function RandomListNode(x){
//     this.label = x;
//     this.next = null;
//     this.random = null;
// }

function Clone(pHead) {
    if (!pHead || !pHead.next) {
        return pHead;
    }
    const map = new Map();
    let node = pHead;
    const newHead = new RandomListNode(node.label);
    let newNode = newHead;
    map.set(node, newNode);

    while (node.next) {
        newNode.next = new RandomListNode(node.next.label);
        node = node.next;
        newNode = newNode.next;
        map.set(node, newNode);
    }

    newNode = newHead;
    node = pHead;
    while (newNode) {
        newNode.random = map.get(node.random);
        newNode = newNode.next;
        node = node.next;
    }

    return newHead;
}

博客地址:剑指 Offer 题解+代码

收藏 Github :https://github.com/dongyuanxin/blog