链表–js剑指offer题目
1.复杂链表的复制
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),请对此链表进行深拷贝,并返回拷贝后的头结点。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
法一:大神方法
/*function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}*/
function Clone(pHead)
{
// write code here
if (pHead===null) return null;
var ptemp = pHead;
//复制链表
while (ptemp) {
var node = new RandomListNode(ptemp.label);
node.next=ptemp.next;
ptemp.next=node;
ptemp = node.next;
}
//深拷贝
ptemp = pHead;
while(ptemp){
if (ptemp.random) {
ptemp.next.random=ptemp.random.next;
}
ptemp=ptemp.next.next;
}
//断开原来的node和新的node之间的链接
ptemp = pHead;
var pnewtemp = pHead.next;
var newhead = pHead.next;
while(pnewtemp.next){
ptemp.next=pnewtemp.next;
pnewtemp.next=pnewtemp.next.next
pnewtemp=pnewtemp.next;
ptemp=ptemp.next;
}
return newhead
}
法二
/*function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}*/
function Clone(pHead)
{
if(!pHead) return null;
let head = new RandomListNode(pHead.label);
head.random = pHead.random;
head.next = Clone(pHead.next);
return head;
}
2.两个链表的公共节点