劍指Offer(13) 複雜鍊錶的複製

2021-08-18 09:06:43 字數 2318 閱讀 4233

題目描述

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

思路:

關於鍊錶的相關操作一定要注意的就是指標的使用,遇到複雜的問題我們可以將問題分成幾個部分分別處理,然後拼接起來就可以解決複雜問題了。

第一步:在原鍊錶的基礎上,在每個結點後面複製與其相同的結點

第二步:因為上面的複製只複製了label和next值並沒有複製random,所以接下來要設定複製結點的隨機鏈結

第三步:將上面已經完整複製好的結點分離出來組成複製鍊錶。也就是將偶數字上的結點拿出來再進行鏈結。

# 返回 randomlistnode

defclone

(self, phead):

self.clonenodes(phead)

self.connectsiblingnodes(phead)

#第一步,在每個結點後複製結點

defclonenodes

(self, phead):

pnode = phead #這樣是為了避免改變phead

while pnode:

pcloned = randomlistnode(pnode.label) #利用鍊錶類生成對應值的結點

pcloned.next = pnode.next

pnode.next = pcloned

pnode = pcloned.next

#第二步,設定複製的結點的隨機random

defconnectsiblingnodes

(self, phead):

pnode = phead #同樣為了避免改變phead

while pnode:

pclone = pnode.next #這樣是為了避免後面忽略出錯,也可以不設定這,只要你後面理清楚pnode的移動就好(最後一步)

if pnode.random:

pclone.random = pnode.random.next

pnode = pclone.next #注意pnode不是跳到pnode.next,而是直接跳到了pnode.next.next

#第三步,將複製結點分離出來進行鏈結組成複製鍊錶

defreconnectnodes

(self, phead):

pnode = phead

pclonehead = none

#定義兩個指標其實就是,乙個頭指標(因為最後要輸出頭指標),乙個是結點指標

pclonenode = none

if pnode:

pclonehead = pclonenode = pnode.next #開始先讓兩個指標指向第乙個複製結點

pnode.next = pclonenode.next

pnode = pnode.next #避免重複一些操作,所以這樣設定以後就可以接著掃瞄作用後面的結點了,因為第乙個結點已經操作過了

while pnode:

pclonenode.next, pclonenode = pnode.next, pclonenode.next

pnode.next, pnode = pclonenode.next, pnode.next

return pclonehead

劍指offer13 將單向鍊錶反轉

題目 將乙個單向鍊錶反轉,輸入原始鍊錶的頭結點,返回反轉後鍊錶的頭結點 使用了兩種方式,第一種方式使用的是尾插法,建立乙個新的鍊錶,這個思路比較明確 第二種方式使用的是建立乙個前向結點,使鍊錶元素逐個反過來指。package 劍指offer 題目 定義乙個函式,輸入乙個鍊錶的頭結點,反轉該鍊錶並輸出...

劍指Offer程式設計練習025 複雜鍊錶的複製

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

劍指Offer 13剪繩子

public static int cuttingrope int n return max.remainder biginteger.valueof 1000000007 intvalue public static biginteger cutting int n,int m 不會有人比我瘋狂了...