演算法題 複雜鍊錶的複製

2021-08-29 04:39:28 字數 2376 閱讀 4779

複雜鍊錶的複製

請實現函式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指標資訊補上,怎麼補?看乙個例子,假設原始鍊錶上的節點nm_psibling指標指向節點s,很顯然此時,nm_pnext指向 n′n^

n′,sm_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...