題目描述: 輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個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指標的節點,之後...