題目描述首先這道題可以在這裡進行演算法測試:複雜鍊錶的複製輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點),返回結果為複製後複雜鍊錶的head。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
定義一下演算法描述的鍊錶節點的資料結構:
public
class
randomlistnode
}
演算法其實並不複雜,但是要將其清楚且完整地表達並且實現出來,還是需要一定的時間與**功底。
認真分析之後,將問題分解,問題分解的好處就是,不要求演算法能夠一蹴而就,並且一蹴而就的演算法**實現會極大增加演算法的實現難度。
所以通過分析,將演算法分成如下3個步驟
:
(1). 第一步:首先拷貝出每個節點,由於鍊錶是從頭到尾拷貝的,那麼後面的拷貝子節點還暫時沒有生成,所以我們就暫時僅僅拷貝單個節點,拷貝的子節點字段暫時不設定。等到完全拷貝之後,到第二部再進行設定。
}**很簡單,就是單純地在每個源鍊錶節點中間拷貝乙個節點插入進去即可。
(2). 第二步:補充拷貝後節點的完整性。即,設定每個拷貝的節點的子節點(即資料結構中的random欄位)
}}(3). 第3步:將整個鍊錶拆成兩個鍊錶,乙個是源鍊錶,乙個是拷貝後的鍊錶。
private randomlistnode reconnectnodes
(randomlistnode node)
return dummyhead.next;
}
這裡用到了設定虛擬頭節點
技巧,這是乙個亮點,其它沒啥技巧,很容易懂。
下面是整個執行通過測試的**:
public
class
solution
private
void
clonenodes
(randomlistnode node)
private
void
connectsilblingnodes
(randomlistnode node)
private randomlistnode reconnectnodes
(randomlistnode node)
}
總的來說還是基本的鍊錶操作,但是問題要分析清楚,問題分析清楚就簡單了。 鍊錶 複雜鍊錶的複製
問題描述 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。結點的定義如下 struct randomlistnod...
複雜鍊錶複製
複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...
複製複雜鍊錶
題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...