剑指offer_复杂链表的复刻

115 阅读1分钟

请实现一个函数可以复制一个复杂链表。

在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者null。

code

/**
 * Definition for singly-linked list with a random pointer.
 * function ListNode(val) {
 *     this.val = val;
 *     this.next = this.random = null;
 * }
 */

/**
 * @param {ListNode} head
 * @return {ListNode}
 */
var copyRandomList = function(head) {
    if(!head) return null;
    let map = new Map();
    map.set(null, null); //很关键。js中如果是null,get是 undefined
    let node = head;
    //复制节点
    while(node){
        map.set(node,new ListNode(node.val));
        node = node.next;
    }
    
    //复制节点的next 和 random
    node = head;
    while(node){
        map.get(node).next = map.get(node.next);  //此时如果node.next 为null,就不需要特判了,set中加好了
        map.get(node).random = map.get(node.random);
        node = node.next;
    }
    
    return map.get(head);
};