请实现一个函数可以复制一个复杂链表。
在复杂链表中,每个结点除了有一个指针指向下一个结点外,还有一个额外的指针指向链表中的任意结点或者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);
};