复杂链表的复制

复杂链表的复制

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;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务