[路飞]_leetcode_剑指 Offer 35. 复杂链表的复制

89 阅读1分钟

请实现 copyRandomList 函数,复制一个复杂链表。在复杂链表中,每个节点除了有一个 next 指针指向下一个节点,还有一个 random 指针指向链表中的任意节点或者 null。

解题思路

可以将每个节点复制一份,跟在节点的后面,然后复制的节点randdom应该指向它的指向节点的下一个节点。

1 -> 2 -> 3 -> 4 -> null;
|         ^
|_________|
 1.random

1 -> 1`-> 2 -> 2` -> 3 -> 3`-> 4 -> 4`->null
|                    ^
|____________________|
        1.random

1 -> 1`-> 2 -> 2` -> 3 -> 3`-> 4 -> 4`->null
     |                    ^
     |____________________|
          1.random.next

    |--------|
pre |       \/
1   1`  2 -> 2` -> 3 -> 3`-> 4 -> 4`->null
| pre.n  ^
|________|

代码

var copyRandomList = function(head) {
    let pre = head;
    // 复制节点到每个节点的后面
    while(pre) {
        pre.next = new Node(pre.val, pre.next, null);
        pre = pre.next.next;
    }
    
    // 开始做random校正
    pre = head;
    while (pre) {
        pre.next.random = pre.random ? pre.random.next : null;
        pre = pre.next.next;
    }

    // 取出新的链表, 还要复原head
    pre = head;
    let newNode = cur = pre.next;
    while(pre) {
        pre.next = pre.next.next;
        cur.next = cur.next ? cur.next.next : null;
        pre = pre.next;
        cur = cur.next;
    }

    return newNode;
};