25-復(fù)雜鏈表的復(fù)制-有不明白的地方

題目描述

輸入一個(gè)復(fù)雜鏈表(每個(gè)節(jié)點(diǎn)中有節(jié)點(diǎn)值,以及兩個(gè)指針,一個(gè)指向下一個(gè)節(jié)點(diǎn),另一個(gè)特殊指針random指向一個(gè)隨機(jī)節(jié)點(diǎn)),請(qǐng)對(duì)此鏈表進(jìn)行深拷貝,并返回拷貝后的頭結(jié)點(diǎn)。(注意,輸出結(jié)果中請(qǐng)不要返回參數(shù)中的節(jié)點(diǎn)引用,否則判題程序會(huì)直接返回空)

代碼

  • 方法一:
    1. 遞歸思想:把大問題轉(zhuǎn)換為若干小問題。
    2. 將復(fù)雜鏈表分為頭結(jié)點(diǎn)和剩余結(jié)點(diǎn)兩部分,剩余部分采用遞歸方法。
function RandomListNode(x){
    this.label = x;
    this.next = null;
    this.random = null;
}
function Clone(pHead)
{
    // write code here
    if(!pHead){
        return null;
    }
    let node = new RandomListNode(pHead.label);
    node.random = pHead.random;
    node.next = Clone(pHead.next);
    return node;
}
  • 方法二:


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

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

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

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

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

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