刷演算法 複雜鍊錶的複製

2021-09-13 16:55:11 字數 851 閱讀 3632

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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)*/

function clone(h)

cur = h;

// 第二次遍歷,複製random指標

while(cur !== null)

cur = cur.next.next;

}var clonedh = h.next;

var temp;

cur = h;

// 第三次遍歷,把鍊錶拆開

while(cur.next !== null)

return clonedh;

}

刷演算法 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。常規的複製鍊錶只需要考慮每個節點的next指標即可,但是該題還有另外乙個random指標,且沒有規律,可能指向任何其他節點,此時需要解決的問題是如何複製rand...

刷題 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 第一反應 分兩步。第一步考慮next,第二步考慮random。利用雜湊表建立對映關係。co...

刷題 複雜鍊錶的複製

一 題目 二 重點難點分析 1.怎麼確定random在新的節點的位置 2.為什麼要用map?答 map函式有鍵值關係,先確定好舊鍊錶的鍵值關係,在從新的煉表裡利用舊煉表裡的鍵key配對random 就是值 3.new 乙個map出來,按著 node,node.val 傳入進到map裡 node是he...