題目:
請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。
例如
輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
思路:一開始沒想通題目啥意思,後面明白了其實是自己引用型別學的不好。定義乙個新的node用原有鍊錶進行賦值,只是給原有鍊錶的節點增加了乙個引用,並不是複製了該節點。
真正的複製,應該是new乙個全新的空node,用對應原鍊錶的val進行賦值,當然next和random也必須指向自己建立的節點。
到這裡可以明確鍊錶至少需要遍歷兩遍。因為首次建立新鍊錶節點時,random指向的節點可能沒有建立,必須要將新鍊錶的節點全部建立好串起來,才可以再遍歷更新random的指向。
那麼問題就在於,怎麼把舊鍊錶的節點關係,在新鍊錶兩個全新的節點中重現?
a代表新鍊錶節點,b代表舊鍊錶節點,即需要找到a.random和b.random的對應關係,進一步想到,只需要擁有a表每個節點與之對應的b表節點的關係對映,問題就可以解決,故想到hashmap。
在遍歷建立b表的同時,以a表節點作為key,b表節點作為value,將ab的對應關係存在map中。第二次遍歷更新random指標時,只要將a對應的b取出,之後將a.random對應的b節點賦值給b.random即可
**如下:
/*總結:當然還是有更牛的大佬,用了更少的空間,採用了拼接/拆分鍊錶的方法解答,**如下:// definition for a node.
class node }*/
class
solution
mapnmap = new hashmap<>();
node newhead = new
node(head.val);
node curnode =head;
nmap.put(head, newhead);
//生成基礎鍊錶與對映map
while (curnode.next != null
)
//更新random指標
curnode =head;
while (curnode != null
) else
curnode =curnode.next;
}return
newhead;}}
/*標準答案,學習乙個。// definition for a node.
class node }*/
//拼接+拆分
/**1 複製各節點,構建拼接鍊錶:
設原鍊錶為node1→node2→⋯ ,構建的拼接鍊錶如下所示:
node1→node1 new→node2→node2 new→⋯
2 構建新鍊錶各節點的 random 指向:
當訪問原節點 cur 的隨機指向節點 cur.random 時,對應新節點 cur.next 的隨機指向節點為 cur.random.next 。
3 拆分原 / 新鍊錶:
設定 pre / cur 分別指向原 / 新煉表頭節點,遍歷執行 pre.next = pre.next.next 和 cur.next = cur.next.next 將兩鍊錶拆分開。
返回新鍊錶的頭節點 res 即可。 */
class
solution
//2 構建新鍊錶各節點的 random 指向
cur=head;
while(cur!=null
) cur=cur.next.next;
}//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...