面試題26 複雜鍊錶的賦值

2022-04-28 18:57:09 字數 1589 閱讀 6421

題目:請實現complexlistnode*clone(complexlistnode*phead),複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個m_pnext指標指向下乙個結點外,還有乙個m_psibling指向鍊錶中任意乙個節點。結點定義如下:

1

struct

complexlistnode

2;

下圖為乙個含有5個結點的複雜鍊錶:

解法一:時間複雜度為o(n2)的演算法

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

解法二:空間換時間的解法

解法一的時間主要花費在定位結點的m_psibling上,可以從這方面做優化。還是分為兩步求解:

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

解法三:無需輔助空間,時間複雜度為o(n)的解法。

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

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

最後將三步合起來:

1 complexlistnode* clone(complexlistnode*phead)

2

面試題26 複雜鍊錶的賦值

有乙個複雜鍊錶,其結點除了有乙個m pnext指標指向下乙個結點外,還有乙個m psibling指向鍊錶中的任一結點或者null。請完成函式complexnode clone complexnode phead 以複製乙個複雜鍊錶。structcomplexnode include using na...

面試題26 複雜鍊錶的複製

以下圖為5個結點的複雜鍊錶,實線表示m pnext指標的指向,虛線表示m psibling指標的指向 方法一 分兩步 1 遍歷一遍鍊錶,用m pnext指標將鍊錶連起來,o n 2 確定每個m psibling指標的指向,需重新遍歷新鍊錶確定其m psibling的指向,o n 時間代價為o n 2...

面試題26 複雜鍊錶的複製

1.給定乙個複雜的鍊錶的資料結構,複製這個鍊錶,在這個資料結構中,每個節點有兩個指標,乙個指標指向下乙個結點,另乙個指標指向鍊錶中的任意結點。資料結構 struct complexlistnode 分析 如下圖所示是乙個複雜鍊錶的示意圖,實現標誌指向下一節點的指標,虛線表示指向任意結點的m psib...