題目描述
輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的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 不會有人比我瘋狂了...