複雜鍊錶的複製演算法

2021-09-01 16:05:41 字數 1817 閱讀 1969

題目:請實現函式complexlistnode * clone(complexlistnode* phead),複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個m_pnext指標指向下乙個節點,還有乙個m_psibiling指標指向鍊錶中的任意節點或者nullptr。節點的c++定義如下:

struct complexlistnode

int   m_nvalue;

complexlistnode*  m_pnext;

complexlistnode*  m_psibling;

第一種思路:

把複製過程分為兩步:第一步是複製原始鍊錶上的每個節點,並用m_pnext鏈結起來;第二步是設定每個節點的m_psibling指標。假設原始鍊錶中的某個節點n的m_psibling指標指向s節點,由於s在鍊錶中可能在n的前面也可能在n的後面,所以要定位s的位置需要從原始鍊錶的頭節點開始找。如果從原始節點的頭節點開始沿著m_pnext經過s步找到節點s,那麼在複製鍊錶節點n'的m_psibling(記為s')離複製鍊錶的頭節點的距離也是沿著m_pnext指標s步。用這種辦法可以為複製鍊錶上的每個節點設定m_psibling指標。

對於乙個含有n個節點的鍊錶,由於定位每個節點的m_psibling都需要從煉表頭節點開始經過o(n)步才能找到,因此總的時間複雜度o(n的平方)。

第二種思路:

(由於第一種時間主要花費在定位節點的m_psibling上面,基於此進行優化)

第 一步仍然是複製原始鍊錶上每個節點n建立n',然後把這些建立出來的節點用m_pnext鏈結起來。同時我們把的配對資訊放到乙個雜湊表中;第二步還是設定複製鍊錶上每個節點的m_psibling。如果在原始鍊錶中節點的n的m_psibling指向節點s,那麼在複製鍊錶中,對應的n'應該指向s'。由於有了雜湊表,我們可以用o(1)時間根據s找到s'。

第二種方法相當於用空間換時間。對於有n個節點的鍊錶,我們需要乙個大小為o(n)的雜湊表。

第三種方法:

第一步仍然是根據原始鍊錶的每個節點n建立對應的n',這一次n'鏈結到n的後面。

完成這一步的**如下:

void clonenodea(complexlistnode* phead)

}

第二步設定複製出來的節點m_psibling。假設原始鍊錶上的n的m_psibling指向節點s,那麼其對應複製出來的n'是n的m_pnext指向的節點,同樣s'也是s的m_pnext指向的節點。

注意:如果原始鍊錶上的節點n的m_psibling指向s,則它對應的複製節點n'的m_psibling指向s的複製節點s'。

第二步的**

void connectsiblingnodes(complexlistnode* phead)

pnode=pcloned->m_pnext;

}}

第三步把這個長鍊表拆分成兩個鍊錶把奇數字置的節點用m_pnext鏈結起來就是原始鍊錶,把偶數字置的節點用m_pnext鏈結起來就是複製出來的鍊錶;

注意:把第二步得到的鍊錶拆分成兩個鍊錶,奇數字置上的節點組成原始鍊錶,偶數字置上的節點組成複製出來的鍊錶。

第三步的**如下:

complexlistnode* reconnectnodes(complexlistnode* phead)

while(pnode!=nunllptr)

return pclonedhead;

}

把上面三步合起來就是複製鍊錶的完整過程。

complexlistnode* clone(complexlistnode* phead)

完整**:

演算法題 複雜鍊錶的複製

複雜鍊錶的複製 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個節點除了有乙個m pnext指標指向下乙個節點,還有乙個m psibling指標指向鍊錶中的任意節點或者nullptr。節點的c 定義如下 後面 均為...

刷演算法 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。常規的複製鍊錶只需要考慮每個節點的next指標即可,但是該題還有另外乙個random指標,且沒有規律,可能指向任何其他節點,此時需要解決的問題是如何複製rand...

刷演算法 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。常規的複製鍊錶只需要考慮每個節點的next指標即可,但是該題還有另外乙個random指標,且沒有規律,可能指向任何其他節點,此時需要解決的問題是如何複製rand...