面試題35:複雜連結串列的複製
題目:請實現 copyRandomList 函式,複製一個複雜連結串列。在複雜連結串列中,每個節點除了有一個 next 指標指向下一個節點,還有一個 random 指標指向連結串列中的任意節點或者 null。
方法一:暴力
先構建連結串列,然後再一個一個的找 random 指標所指向的結點
- 時間複雜度O(n^2)
- 空間複雜度O(1)
時間效率太差了,完全沒有美感
方法二:空間換時間
用一個大小為 n 的 hash 表儲存,用 O(n) 的空間把時間從 O(n^2) 降到 O(n)
方法三:同步複製
第一趟遍歷構建複製結點,對連結串列中的每一個結點作一個複製,複製結點連結在當前結點之後,複製的結點的 next 為當前結點的下一個結點。
第二趟遍歷,構建 random 指標,複製結點的 random 指標指向,當前結點 random 的下一個結點,同時斷開當前結點和複製結點的連結,就可以得到深拷貝的複雜連結串列了。
- 指標太亂了,可以多定義幾個防止混淆和空指標判定
- 時間複雜度O(n)
- 空間複雜度O(1)
class Solution {
public Node copyRandomList(Node head) {
if (head == null ){
return null;
}
Node curr = head;
//拷貝連結串列,並且把連結串列連線起來
while(curr != null){
Node next = curr.next;
Node copy = new Node(curr.val);
curr.next = copy;
copy.next = next;
curr = next;
}
//指定隨即指標
curr = head;
while(curr != null){
Node next = curr.next.next;//原節點的下一個節點
Node currCopy = curr.next;//當前的拷貝節點
currCopy.random = curr.random!=null?curr.random.next:null;//指定隨機指標節點
curr = next;//當前節點指向下一個節點
}
//拆分連結串列
curr = head;
Node res = curr.next;//用於返回的拷貝頭節點
while (curr != null){
Node next = curr.next.next;//原節點的下一個節點
Node curCopy = curr.next;//拷貝節點
curr.next = next;//將原節點指向下一個原節點
curCopy.next = next!=null?next.next:null;//拷貝節點的下一個節點指向下一個原節點的下一個節點
curr = next;//將當前節點指向下一個原節點
}
return res;
}
}
相關文章
- 複雜連結串列的賦值賦值
- 隨機連結串列的複製隨機
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 複製帶隨機指標的連結串列隨機指標
- [連結串列]leetcode138-複製帶隨即指標的連結串列LeetCode指標
- 連結串列專題——面試中常見的連結串列問題面試
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- LeetCode 複製帶隨機指標的連結串列LeetCode隨機指標
- Leetcode 234. 迴文連結串列 快慢指標+連結串列逆序實現O(n)時間複雜度且O(1)空間複雜度LeetCode指標時間複雜度
- js實現複製連結JS
- 0928面試小節:刪除有序連結串列中的重複元素面試
- 「複製帶隨機指標的連結串列」的一個很巧妙解法隨機指標
- 【圖解連結串列類面試題】移除連結串列元素圖解面試題
- 【圖解連結串列類面試題】環形連結串列圖解面試題
- LeetCode-138-複製帶隨機指標的連結串列LeetCode隨機指標
- 面試中的複雜度分析面試複雜度
- 【LeetCode-連結串列】面試題-反轉連結串列LeetCode面試題
- 連結串列面試題(七)---合併兩個有序連結串列面試題
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 連結串列面試題(十一)---求帶環單連結串列 環的入口點面試題
- ZeroClipboard 多個複製按鈕,多個複製連結 實現方式
- 連結串列面試題(十)---求帶環單連結串列的環的長度面試題
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- (連結串列)連結串列的排序問題排序
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- 連結串列面試題(九)---判斷一個連結串列是否帶環面試題
- 從未排序的連結串列中刪除重複項排序
- 一些Q複製實踐的連結
- 搞懂單連結串列常見面試題面試題
- 連結串列面試題(八)---約瑟夫環面試題
- 淺複製和深複製的概念與值複製和指標複製(引用複製)有關 淺複製 “指標複製 深複製 值複製指標
- L2-002 連結串列去重(複習)
- 連結串列面試題(十二)---判斷兩個都不帶環的連結串列是否相交面試題
- Day 7.5 資料型別總結 + 複製 淺複製 深複製資料型別
- LeetCode 138:複製帶隨機指標的連結串列 Copy List with Random PointerLeetCode隨機指標random
- 單連結串列複製你已經會了,如果我們再加個指標...指標
- 面試題分解—「淺複製/深複製、定義屬性使用copy還是strong ?」面試題
- 一個node連結串列翻轉的面試題面試題