請實現 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...