劍指Offer26複雜鍊錶的複製

2021-06-23 09:56:51 字數 1493 閱讀 7145

題目:

請實現函式複製乙個複雜鍊錶,在複雜鍊錶中,每個結點除了有乙個m_pnext指標指向下乙個結點外,還有乙個m_psibling指向鍊錶中的任意結點或者null。

分析:這個題還是挺有難度的,我剛拿到題的時候想的是我可以先把簡單鍊錶複製一遍,然後再從頭挨著找m_psibling指標指向的結點,這樣一算時間複雜就成了o(n2)了,顯然這是最最直接也是最笨的方法,那麼肯定會有更好的方法。

這個題我沒想出來,後來看到書上是這麼介紹的,總共介紹了2種方法,加上上面最笨的方法總共3種,下面我來詳細闡述一下。

第一種:

因為在找m_psibling指標指向結點的過程中是要從頭開始遍歷的,這樣就把時間都浪費在了尋找結點的身上了,那麼可以用一種方法來節省尋找結點的時間花費。對了,就是用空間置換時間,可以增加乙個陣列來記錄每個陣列中的值對應乙個結點,這樣當查詢結點時就可以直接查詢陣列,然後對應到結點上就好了。當然這裡的陣列不是簡單的陣列,而是乙個可以儲存結點的表。

第二種:

這是一種沒有另外增加空間的方法,很神奇吧!下面我們就來慢慢看這種方法,這種方法是一種讓人享受的方法。

我們想在整個問題的解決過程中,最浪費時間的地方就是尋找m_psibling指標指向的結點,我們的優化方法就一直圍繞著這一點來進行,前面的思路是用乙個外開的記憶體來記錄所對應的位置,那如果我們一開始就知道他的位置是不是就不用再尋找了?!對!是不用再尋找了。可是怎麼就能一開始就知道他的位置呢?我們知道的原始鍊錶的位置,那我們能不能在它身上做文章呢?當然可以了,可怎做呢?哈哈!靈機一動!奧!演算法!!!

當我們在複製鍊錶的過程中,我們是另外開闢了乙個空間來存放的,那麼我們如果就在這個鍊錶身上覆制呢?對啊!可以把每個結點對應的複製的結點都放在各自結點的後面。

就像圖中展示一樣。似乎這時候就不用再用語言來表達了,這是演算法的神奇。

可以分成三步來實現,

1.複製鍊錶,實現m_pnext指標,並把複製鍊錶和原始鍊錶穿插進行成乙個鍊錶,這樣奇數字置是原始鍊錶,偶數字置就是複製的鍊錶。

2.實現m_psibling指標,x結點的m_psibling指標指向y,那麼x的下乙個結點就是複製的x·結點,它的m_psibling指標就指向y的下乙個結點y·

3,分來鍊錶,奇數字置的是原始鍊錶,偶數字置的是複製鍊錶。

下面看**:

void clonenodes(complexlistnode * phead)

}void connectsiblingnodes(complexlistnode * phead)

}complexlistnode * reconnectnodes(complexlistnode * phead)

while(pnode != null)

return clonehead;

}complexlistnode * clone(complexlistnode * phead)

劍指Offer 26 複雜鍊錶的複製

題目 有乙個複雜鍊錶,其結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任一結點或者null。其結點的c 定義如下 請完成函式complexnode clone complexnode phead 以複製乙個複雜鍊錶。第一種方法 分成兩步 第一步是複製原始鍊...

劍指offer 26 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 用乙個輔助字典,儲存原鍊錶和複製鍊錶的對應關係。第二次遍歷的時候,生成random節點。c...

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

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