劍指offer 複雜鍊錶的複製

2022-05-26 18:12:12 字數 1772 閱讀 7034

請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。

示例 1:

輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]

輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]

示例 2:

輸入:head = [[1,1],[2,1]]

輸出:[[1,1],[2,1]]

示例 3:

輸入:head = [[3,null],[3,0],[3,null]]

輸出:[[3,null],[3,0],[3,null]]

示例 4:

輸入:head =

輸出:解釋:給定的鍊錶為空(空指標),因此返回 null。

-10000 <= node.val <= 10000

node.random 為空(null)或指向鍊錶中的節點。

節點數目不超過 1000 。

我們複製一般的鍊錶是這麼做的

class solution 

return dum.next;}}

出現的問題(即注釋掉的語句)主要是,我們的鍊錶節點是乙個乙個建立起來的,如圖

我們建立哨兵節點0後,建立第乙個節點7,但是7後面的元素都還沒構造出來,所以cur.random實際上是節點7呼叫node建構函式的時候預設初始化的null,故輸出凡是涉及到random,全是null。

先用map建立和原複雜鍊錶一樣的鍊錶,遍歷新的鍊錶(前後節點都已經建立好了),明確random的指向

// definition for a node.

class node

}class solution

//將cur重新放回頭部

cur = head;

//構建新鍊錶的next和random指向

while(cur != null)

//返回新鍊錶的頭結點

return hmap.get(head);}}

將新節點拼接在老節點後(eg.1->2->3 變為1->new_1->2-> new_2->3->new_3),明確random指向,返回拆分後的鍊錶

class solution 

//2.構建各節點的random指向

cur = head;

while(cur != null)

//3.拆分兩鍊錶

cur = head.next;

node pre = head, res = head.next;

while(cur.next != null)

pre.next = null;//單獨處理原煉表表尾節點

return res;//返回新煉表頭節點}}

劍指offer複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...

劍指offer 複雜鍊錶複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a...

劍指offer 複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 非遞迴方法 struct randomlistnode randomlistno...