leetcode-138-复制带随机指针的链表

69 阅读1分钟

image.png leetcode原题

解题思路

  • 一对一复制链表节点到新的链表
  • 对应处理一对一节点的复制节点的random指针域
  • 拆分链表为两个链表,并且对应返回复制节点的链表
var copyRandomList = function (head) {
    if (!head) return head;
    let p = head;
    let q;
    // 将每个节点单独复制一份
    while (p) {
        q = new Node(p.val);
        q.random = p.random;
        q.next = p.next;
        p.next = q;
        p = q.next;
    }

    // 修正每个节点的random指针域
    p = head.next;
    while (p) {
        if (p.random) p.random = p.random.next;
        (p = p.next) && (p = p.next);
    }

    // 拆分成两个独立的子链表(设置两个虚拟头节点)
    let new_head = head.next;
    p = head;
    while (p) {
        q = p.next;
        p.next = q.next;
        if (p.next) q.next = p.next.next;
        p = p.next;
    }

    return new_head;
};