輸入乙個複雜鍊錶(每個節點中有節點值,以及兩個指標,乙個指向下乙個節點,另乙個特殊指標random指向乙個隨機節點),請對此鍊錶進行深拷貝,並返回拷貝後的頭結點。(注意,輸出結果中請不要返回引數中的節點引用,否則判題程式會直接返回空)
利用雜湊表的查詢特點,考慮構建原鍊錶節點和新鍊錶對應節點的鍵值對對映關係,再遍歷構建新鍊錶各節點的next
和random
引用指向即可。
/**
時間複雜度: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...