複雜鍊錶的複製

2022-06-17 06:24:10 字數 2123 閱讀 3734

題目描述: 輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個next指向下乙個節點,另乙個特殊指標random指向乙個隨機節點), 請對此鍊錶進行深拷貝,並返回拷貝後的頭結點。

最近有人跟我提到這個問題,網上一搜原來是乙個經典面試題。我的笨腦袋想不到最優解法,但是想到了兩個常規解和乙個帶限制的解法。下面把這四種解法都列出來。

解法一:

先做正常拷貝,即next正確。然後同時遍歷兩個鍊錶,對於原鍊錶的每個結點,再同時遍歷兩個鍊錶找到原random所在位置,也就有了新random所在位置。

時間複雜度為o(n^2)。

解法二:

先做正常拷貝,即next正確,同時建立乙個雜湊表《原結點,複製結點》。同時遍歷兩個鍊錶,對於每乙個複製結點,其random等於對應的原結點的random,在表中的對映。

時間複雜度大致為o(n),因為雜湊表通常很快。空間複雜度稍高。但是對於實際工程,這個雜湊表通常可以復用,而且實現較有條理,容易理解,因此我認為在實際專案中這是最合適的解法。

解法三:

先做正常拷貝,即next正確,對於每個原結點,將其random指向對應的複製結點,而複製結點的random指向原結點的random。相當於是讓複製結點充當乙個橋接,復用原記憶體建立兩個對映,並且沒有丟失資訊。

最後同時遍歷兩個鍊錶,每一步都重建原結點和複製結點的random。

但是這個方法有個限制,必須前提保證random向後指,不能向前指,否則遍歷的過程中也同時破壞對映,演算法就會失效。

解法四:

這應該是最優解了:每次複製原結點,將複製結點插入其後,這樣形成了乙個長度2倍的復合鍊錶。對於每乙個複製結點,它的random為原結點的random的next。最後再把這個復合鍊錶拆散還原。網上有詳盡**解釋,這裡不再贅述。

下面是c++**實現:

#include #include 

#include

#include

typedef

intdata;

struct

node

};node *copy_method1(node *list)

for (node *curr = list, *currcopy = listcopy; curr; curr = curr->next, currcopy = currcopy->next)

}return

listcopy;

}node *copy_method2(node *list)

//2. eval random

for (node *curr = list, *currcopy = listcopy; curr; curr = curr->next, currcopy = currcopy->next)

if (curr->random)

currcopy->random = raw2copy[curr->random];

return

listcopy;

}node *copy_method3(node *list)

for (node *curr = list, *currcopy = listcopy; curr; curr = curr->next, currcopy = currcopy->next)

return

listcopy;

}node *copy_method4(node *list)

for (node *curr = list; curr; curr = curr->next->next)

for (node *curr = list; curr; curr = curr->next)

return

listcopy;

}node *helper_genrandlist()

return nodes[0];}

int helper_validate(node *lista, node *listb)

lista = lista->next;

listb = listb->next;

}return0;

}void helper_printlist(node *list)

printf(

"---------------\n");

}int

main()

鍊錶 複雜鍊錶的複製

問題描述 請實現函式complexlistnode clone complexlistnode phead 複製乙個複雜鍊錶。在複雜鍊錶中,每個結點除了有乙個next指標指向下乙個結點之外,還有乙個random指向鍊錶中的任意結點或者null。結點的定義如下 struct randomlistnod...

複雜鍊錶複製

複雜鍊錶複製的標頭檔案mlist.h ifndef mlist h define mlist h include include includetypedef int datatype typedef struct node node,pnode,plist pnode crealist datat...

複製複雜鍊錶

題目 輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 解題思路 首先有三種解法 第一種就是中規中矩的解法,首先複製next指標的節點,之後...