题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
要注意,这道题不是简单的二叉树复制,我们知道,二叉树是一直向下走的,不会往回走。但是题目的这个复杂链表不一样,他除了有一个next
指针之外,还有一个random
指针,这个指针可以指向复杂链表之前的任意一个节点,图示如下:
所以说如果我们按照普通的二叉树复制的话,就可能陷入无限的循环当中。此时我们换一种思路,依次向每一个节点的下一个节点插入相同的节点,示意图如下:
/*function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}*/
function Clone(pHead)
{
if(!pHead){return null;}
let _pHead = pHead;
while(pHead){
let temp = new RandomListNode(pHead.label);
temp.next = pHead.next;
pHead.next = temp;
pHead = pHead.next.next;
}
pHead = _pHead;
while(pHead){
pHead.next.random = pHead.random?pHead.random.next:null;
pHead = pHead.next.next;
}
let temp = _pHead.next;
let res = temp;
_pHead = _pHead.next.next;
while(_pHead){
temp.next = _pHead.next;
_pHead = _pHead.next.next;
temp = temp.next;
}
return res;
}