題目要求:
請將乙個特殊鍊錶複製乙份,乙個特殊的鍊錶節點結構如下:
node類中包含:
value:表示節點的值
next:表示下乙個節點
rand:表示隨機指向的任意乙個節點
題目分析:
相當於,就是在乙個普通單鏈表的基礎上,每個節點多了乙個可以任意指向的指標,比如:1–>2–>3,然後1的rand指向3,2的rand指向1,3的rand指向null。
要想複製鍊錶,首先,需要將原鍊錶遍歷一遍,然後,複製出每個節點,如果只是普通的複製單鏈表問題,那麼,將他們依次連線起來就行了。但是,這題的特殊之處就在於,除了next,每個節點還有個rand指標,那麼,如果我想找到1的rand是3,那麼,在複製的節點1中,rand應該指向複製的3,但是,我怎麼能拿到複製的3?假設在原來的鍊錶中,3在1的前面呢?那麼,就算在原來的鍊錶中,我也不可能通過next找到3,只能通過原來鍊錶的rand找到原來的3。因此,rand指向的節點,只能通過rand來找到,因為如果rand指向的節點在前面,next就找不到。那麼,問題來了,我們可以在原來的鍊錶中,通過rand指標找到rand指向的節點,可是,怎麼確定新建立的節點,哪個是原來rand指向的節點複製的呢?因此,此題的關鍵點在於,怎麼把新建立的節點和原來的節點對應起來。
筆試思路:
既然明白了此題的關鍵點在於,怎麼把新建立的節點和原來一節點一一對應起來,那麼問題就很清楚了。一一對應關係,想到了什麼資料結構?沒錯,就是雜湊表map。用map把原來的節點與複製的節點一一對應起來。然後,第一遍遍歷的時候,依次複製節點,並且把複製後的1和原來的1節點,放進map中,然後,第二遍遍歷,找到1的next和rand,把1的next和rand指向的內容,在map中查詢到對應的複製後的節點,然後把1複製後的節點,鏈結上他們,然後依次進行。
這是筆試中最容易的做法,只需要借助map來儲存對應關係。缺點是空間複雜度是o(n),因此儲存map需要開闢空間。
面試思路:
如果要求你用空間複雜度o(1)來實現,怎麼寫?
其實就是在問你,如果不借助額外空間map來實現一一對應關係,怎麼實現新建立的節點和原來的節點一一對應?
其實,可以這樣考慮,既然不能申請額外空間來對應,那麼,因此鍊錶容易鏈結斷開的特殊性,是否可以直接把複製的節點,直接鏈結在原來節點的後面呢?
比如:1–>1的複製節點–>2–>2的複製節點…
這樣,我們可以每次取兩個節點,比如,分別是1和1的複製節點,然後,複製1的rand節點就是原來1節點的rand的next,這樣就可以把複製後的rand節點鏈結起來了。然後,再遍歷一遍,把相應的複製的1的next節點就是複製的1的節點的next的next,就也把next指標鏈結好了。這樣,就完成了複製。
複製含有隨機節點的鍊錶
輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 由於是深copy,隨機節點指向的物件也應該是新的節點。給出兩種解法 第一種,採用hashm...
演算法總結之 複製含有隨機指標節點的鍊錶
一種特殊的鍊錶節點類描述如下 public class node public node copylistwithrand1 node head cur head while cur null return map.get head 介紹高階做法 不適用雜湊表來儲存對應關係,只用有限的幾個變數完成所...
複製帶隨機指標的鍊錶
給出乙個鍊錶,每個節點包含乙個額外增加的隨機指標可以指向鍊錶中的任何節點或空的節點。返回乙個深拷貝的鍊錶。public randomlistnode copyrandomlist randomlistnode head hashmapmap new hashmap randomlistnode du...