劍指offer 複雜鍊錶的複製

2021-07-25 06:58:42 字數 1570 閱讀 4538

題目:請實現函式complexlistnode*clone(complexlistnode*phead),

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

複雜鍊錶如圖例:

我們對單鏈表的複製已經很清楚,因此很容易形成思路,先將鍊錶整個複製,但是先將m_psiling初始化為null(顯然,我們在所有節點不全存在的時候是不能進行m_psiling的設定的,因為它很有可能指向的結點現在並沒有建立);有了第一步所有結點都存在時,我們可以根據原煉表中當前結點和其m_psiling指向結點的位置關係來設定該指標。

//第一步:實現next複製,使整個鍊錶成型

//第二步:對每個結點,通過在源結點查詢到random指標指向的是距離頭結點第幾個結點,

//那麼複製的鍊錶對應的結點的random也指向距頭結點第幾個結點

//複雜度是o(n)+o(n)*n

當然有更好的思路(**於劍指offer)

//更好的思路是(特點:思路巧妙,相對複雜,實現也相對麻煩,複雜度低)

//第一步:複製(將a複製在a的後面)

//第二步:設定random

//第三步:將a和a分開

//複雜度:o(n)+o(1)*n+o(n)

(1)將複製鍊錶每乙個結點依附於源結點(極大的便利了m_psiling的設定)

(2)設定m_psiling

(3)拆分原鍊錶和複製鍊錶

其實大多數人一旦知道這種依附於源結點建立複製結點的想法後,其他的思路都會自然而來的,只是指標操作看似簡單,還是要十分小心,考慮周到。

附**:

class solution 

private:

randomlistnode*copyafter(randomlistnode*phead)

return phead;

}void buildrandom(randomlistnode* mergehead)

}randomlistnode* splitlist(randomlistnode* mergehead)

return newhead;}};

結點的結構體:

struct randomlistnode 

};

指標的題真的要思考清楚了再動筆,另外迴圈中語句的先後順序與迴圈條件的設定是有關係的,琢磨琢磨就會形成自己的一套不易出錯的模式。

歡迎交流指導~

劍指offer複雜鍊錶複製

題目描述 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 我的 思路比較笨,就是首先構造乙個正常的不大random指標的鍊錶,然後再去遍歷...

劍指offer 複雜鍊錶複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a...

劍指offer 複雜鍊錶複製

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