複雜鍊錶的複製
請實現函式complexlistnode* clone(complexlistnode*phead)
,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個m_pnext
指標指向下乙個節點,還有乙個m_psibling
指標指向鍊錶中的任意節點或者nullptr
。
節點的c++定義如下(後面**均為c++**段):
struct complexlistnode
;
例如(乙個包含5個節點的複雜鍊錶):
總結一下昨天小公尺演算法校招現場面試,首先是,面試官很 nice,就是你不會,人家也會引導你,很有耐心。一面的時候比較基礎,各種演算法推導等,出了乙個二叉樹的遍歷(s型遍歷,層次遍歷的一種,廣度優先佇列實現即可)。二面的時候,先做兩道演算法題目,第乙個就是本次要總結的題目《複雜鍊錶的複製》,比較遺憾,當時沒能給出時間複雜度為o(n)
解決方法,這也是要總結的原因,第二個題目是《二叉樹的最近公共祖先》,這個倒是給出了解決方法。後來看了一下,發現那個題目是《劍指offer》上的,看來還是自己沒準備好呀。現在參考這本學習一下,書中提供了三種方法,前兩中,面試的時想到了,現在就學習一下最後一種方法(時間複雜度o(n),空間複雜度為o(1)
),具體思路分三步:
(1)對應著原始鍊錶中的每乙個節點,複製,並插入當前節點的後面(這一過程只操作m_pnext
指標,看下圖,新複製的節點表示為:n′n^
節點複製**如下:
void
clonenodes
(complexlistnode* phead)
}
(2)在(1)的基礎上,把每個新複製的節點m_psibling
指標資訊補上,怎麼補?看乙個例子,假設原始鍊錶上的節點n的m_psibling
指標指向節點s,很顯然此時,n的m_pnext
指向 n′n^
n′,s的m_pnext
指向 s′s^
s′,利用這些資訊,就可以完成m_psibling
資訊補全。補全後如下圖:
節點m_psibling
補全**如下:
void
connectsiblingnodes
(complexlistnode* phead)
pnode = pcloned->m_pnext;
}}
(3)把(2)得到鍊錶拆分成兩鍊錶,奇數字節點重新恢復為原始鍊錶,偶數字節點重新連線,就得到了,新複製的鍊錶。
重組**如下:
complexlistnode*
reconnectnodes
(complexlistnode* phead)
while
(pnode != nullptr)
return pclonedhead;
}
宣告:總結學習,有問題或不妥之處,可以批評指正哦。
題目、**:《劍指offer》第二版,現場面試題
書中、**參考:github.com/zhedahht/codinginterviewchinese2/blob/master/35_copycomplexlist/copycomplexlist.cpp
演算法題 複雜鍊錶的複製
請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶,在複雜鍊錶中,每個結點除了有乙個m ppext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任意結點或者 null。結點的 c 定義如下 struct complexl...
leetcode演算法題 複雜鍊錶的複製
題目 請實現 copyrandomlist 函式,複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個 next 指標指向下乙個節點,還有乙個 random 指標指向鍊錶中的任意節點或者 null。示例 1 輸入 head 7,null 13,0 11,4 10,2 1,0 輸出 7,null 13,...
複雜鍊錶的複製演算法
題目 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個m pnext指標指向下乙個節點,還有乙個m psibiling指標指向鍊錶中的任意節點或者nullptr。節點的c 定義如下 struct co...