Loading

剑指offer[25]——复杂链表的复制

题目描述

输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的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;
}
posted @ 2020-03-16 10:54  Jacob是我了  阅读(101)  评论(0编辑  收藏  举报