复杂链表的复制
复杂链表的复制
http://www.nowcoder.com/questionTerminal/f836b2c43afc4b35ad6adc41ec941dba
思路——一步一步做
第1步:先不管random,按照普通链表复制
第2步:从头开始,处理random的复制
代码
function RandomListNode(x){
this.label = x;
this.next = null;
this.random = null;
}
function Clone(pHead)
{
// write code here
// 第1步:先复制next。顺便把复制过的节点做记录
var pre1 = []; // 记录被复制过的节点
var pre2 = []; // 记录复制后的节点,与pre1一一对应
var copyed = clone(pHead, pre1, pre2);
// 第2步:再复制random
for(var i=0;i<pre1.length;i++){
// 如果指向的是我pre里记录过的节点
var index = pre1.indexOf(pre1[i].random);
pre2[i].random = index ==-1 ? clone(pre1[i].random) : pre2[index];
}
return copyed;
}
// 辅助函数,复制链表
function clone(node, pre1, pre2){
if(node == null){
return null;
}
var copyed = new RandomListNode(node.label);
if(pre1 !== undefined && pre2 !== undefined){
pre1.push(node);
pre2.push(copyed);
}
copyed.next = clone(node.next, pre1, pre2);
return copyed;
}
查看8道真题和解析
