【刷算法】庞杂链表的复制

题目形貌

输入一个庞杂链表(每一个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特别指针指向恣意一个节点),返回效果为复制后庞杂链表的head。

剖析

通例的复制链表只须要斟酌每一个节点的next指针即可,然则该题另有别的一个random指针,且没有规律,能够指向任何其他节点,此时须要处理的题目是怎样复制random指针。最先想先经由过程next指针构建新的链表,同时运用栈保留各个新节点,然后再经由过程栈来构建random指针,然则发明过程当中并没有这么简朴,比方关于A.random=C来讲,那末在新链表中就是A1.random=C1,我没法在新链表中以O(1)的时刻庞杂度接见C1,所以我这类要领受阻。

在网上查到一种思绪,遍历链表的时刻把每一个新节点添加在旧节点的背面,比方 A->B->C,复制完是A->A1->B->B1->C->C1,然后关于每一个复制节点来讲来讲,A1.random=A.random.next,B1.random=B.random.next,C1.random=C.random.next,圆满的处理了复制random指针时获取到目的节点的题目。末了再拆成两条链表即可。

代码完成

/*function RandomListNode(x){
    this.label = x;
    this.next = null;
    this.random = null;
}*/
function Clone(h)
{
    if(h === null)
        return h;
    var cur = h;
    // 第一次遍历,先复制一切节点,且把复制节点添加到响应节点背面
    while(cur !== null) {
        var node = new RandomListNode(cur.label);
        node.next = cur.next;
        cur.next = node;
        cur = node.next;
    }
    
    cur = h;
    // 第二次遍历,复制random指针
    while(cur !== null) {
        if(cur.random !== null){
            cur.next.random = cur.random.next;
        }
        cur = cur.next.next;
    }
    var clonedH = h.next;
    var temp;
    cur = h;
    // 第三次遍历,把链表拆开
    while(cur.next !== null) {
        temp = cur.next;
        
        cur.next = cur.next.next;
        cur = temp;
    }   
    
    return clonedH;
}
    原文作者:亚古
    原文地址: https://segmentfault.com/a/1190000015544838
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞