复杂链表的复制
题目描述:
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针random指向一个随机节点),
请对此链表进行深拷贝,并返回拷贝后的头结点。
注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空。
问题分析:
两种方式:
1,利用map对象,使用哈希表,通过哈希表来对应拷贝前后的两个复杂链表,
通过原链表的random作为键,取到新链表的random应该指向的结点。
2,直接递归复制
代码展示:
/*function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}*/
function Clone(pHead)
{
// 1,直接复制
if(!pHead)
return null;
var node = new RandomListNode(pHead.label);//头节点
node.random = pHead.random;
node.next = Clone(pHead.next);//递归节点
return node;
//2,使用map对象
if(!pHead) return null;
const map=new Map();
let p,p2;
p=pHead;
p2=new RandomListNode(pHead.label);
const pHead2=p2;
map.set(p,p2);
while(p){
if(p.next) p2.next=new RandomListNode(p.next.label);
else p2.next=null;
p=p.next;
p2=p2.next;
map.set(p,p2);
}
p=pHead;
p2=pHead2;
while(p){
p2.random=map.get(p.random);
p=p.next;
p2=p2.next;
}
return pHead2;
}