題目:請實現函式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...