劍指Offer1 複雜鍊錶的複製

2022-09-08 14:33:15 字數 2193 閱讀 8761

題目:

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