《劍指offer》— JavaScript(25)復(fù)雜鏈表的復(fù)制

復(fù)雜鏈表的復(fù)制

題目描述

輸入一個(gè)復(fù)雜鏈表(每個(gè)節(jié)點(diǎn)中有節(jié)點(diǎn)值,以及兩個(gè)指針,一個(gè)指向下一個(gè)節(jié)點(diǎn),另一個(gè)特殊指針指向任意一個(gè)節(jié)點(diǎn)),返回結(jié)果為復(fù)制后復(fù)雜鏈表的head。(注意,輸出結(jié)果中請不要返回參數(shù)中的節(jié)點(diǎn)引用,否則判題程序會(huì)直接返回空)


思路一

  1. 遞歸思想:把大問題轉(zhuǎn)換為若干小問題。
  2. 將復(fù)雜鏈表分為頭結(jié)點(diǎn)和剩余結(jié)點(diǎn)兩部分,剩余部分采用遞歸方法。

實(shí)現(xiàn)代碼

function RandomListNode(x) {
    this.label = x;
    this.next = null;
    this.random = null;
}

function Clone(pHead) {
    if (!pHead) {
        return null;
    }
    // 復(fù)制頭結(jié)點(diǎn)
    var node = new RandomListNode(pHead.label);
    node.random = pHead.random;
    // 遞歸其他節(jié)點(diǎn)
    node.next = Clone(pHead.next);
    return node;
}

思路二

  1. 在舊鏈表中,復(fù)制每一個(gè)結(jié)點(diǎn),并將復(fù)制的結(jié)點(diǎn)插入該結(jié)點(diǎn)后面。


    圖片.png
  2. 遍歷鏈表,初始化復(fù)制結(jié)點(diǎn)的random指向。


    圖片.png
  3. 將鏈表拆分為原鏈表和復(fù)制所得鏈表。

圖片.png

實(shí)現(xiàn)代碼

function RandomListNode(x) {
    this.label = x;
    this.next = null;
    this.random = null;
}

function Clone(pHead) {
    if (pHead === null) return;

    // 對應(yīng)思路二中的第一步:
    var currNode = pHead;
    while (currNode !== null) {
        var node = new RandomListNode(currNode.label);
        node.next = currNode.next;
        currNode.next = node;
        currNode = node.next;
    }

    // 對應(yīng)思路二中的第二步:
    currNode = pHead;
    while (currNode !== null && currNode.next !== null) {
        if (currNode.random) {
            currNode.next.random = currNode.random.next;
        }
        currNode = currNode.next.next;
    }

    //拆分,對應(yīng)思路二中的第三步:        
    var pCloneHead = pHead.next;
    var temp = null;
    currNode = pHead;
    while (currNode.next !== null) {
        tmp = currNode.next;
        currNode.next = tmp.next;
        currNode = tmp;
    }
    return pCloneHead;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 總結(jié) 想清楚再編碼 分析方法:舉例子、畫圖 第1節(jié):畫圖分析方法 對于二叉樹、二維數(shù)組、鏈表等問題,都可以采用畫圖...
    M_巴拉巴拉閱讀 1,293評論 0 7
  • 轉(zhuǎn)載請注明出處:http://www.itdecent.cn/p/c65d9d753c31 在上一篇博客《數(shù)據(jù)結(jié)構(gòu)...
    Alent閱讀 3,595評論 4 74
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,661評論 0 25
  • 【聲明】歡迎轉(zhuǎn)載,但請保留文章原始出處→_→文章來源:http://www.itdecent.cn/p/08d08...
    夢工廠閱讀 3,847評論 3 31
  • //leetcode中還有花樣鏈表題,這里幾個(gè)例子,冰山一角 求單鏈表中結(jié)點(diǎn)的個(gè)數(shù)----時(shí)間復(fù)雜度O(n)這是最...
    暗黑破壞球嘿哈閱讀 1,645評論 0 6

友情鏈接更多精彩內(nèi)容