劍指offer25 複雜鍊錶的複製 題解

2022-07-26 13:00:15 字數 1188 閱讀 8916

輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標random指向乙個隨機節點),請對此鍊錶進行深拷貝,並返回拷貝後的頭結點。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)

利用雜湊表的查詢特點,考慮構建原鍊錶節點新鍊錶對應節點的鍵值對對映關係,再遍歷構建新鍊錶各節點的nextrandom引用指向即可。

/**

時間複雜度:o(n)

兩輪遍歷鍊錶,使用 o(n) 時間。

空間複雜度:o(n)

雜湊表 dic 使用線性大小的額外空間。

**/class solution

cur = phead;

// 構建新鍊錶的next和random指向

while (cur != nullptr)

// 返回新鍊錶的頭節點

return mp[phead];

}};

①第一步:根據原始鍊錶的每個節點 \(n\) 建立對應的 \(n'\) ,再把 \(n'\) 鏈結到 \(n\) 的後面

②第二步:設定複製出來的節點的 \(random\) 指標

③第三步:把這個長鍊表拆分成兩個鍊錶:把奇數字置的節點用 \(next\) 指標鏈結起來就是原始鍊錶,把偶數字置的節點用 \(next\) 指標鏈結起來就是複製出來的鍊錶

/**

時間複雜度:o(n)

三輪遍歷鍊錶,使用 o(n) 時間。

空間複雜度:o(1)

節點引用變數使用常數大小的額外空間。

**/class solution

// 2.構建各新節點的random指向

cur = phead;

while (cur != nullptr)

// 3.拆分兩鍊錶

cur = phead->next;

randomlistnode *pre = phead, *res = phead->next;

while (cur->next != nullptr)

pre->next = nullptr; //單獨處理原煉表尾節點

return res; //返回新煉表頭節點

}};

劍指offer 25 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 include include include using namespace std s...

劍指offer 25 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 本題的最簡答的思路就是先實現結點與next指標的複製,然後利用遍歷整個鍊錶尋找每個結點的r...

劍指offer 25 複雜鍊錶的複製

輸入乙個複雜鍊錶 每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標指向任意乙個節點 返回結果為複製後複雜鍊錶的head。注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空 1 複製每個節點,如 複製節點a得到a1,將a1插入節點a後面 2 遍歷鍊錶,a1 ran...