【連結串列問題】打卡8:複製含有隨機指標節點的連結串列
前言
以專題的形式更新刷題貼,歡迎跟我一起學習刷題,相信我,你的堅持,絕對會有意想不到的收穫。每道題會提供簡單的解答,如果你有更優雅的做法,歡迎提供指點,謝謝。
注:如果程式碼排版出現了問題麻煩通知我下,謝謝。
【題目描述】
【要求】
如果連結串列的長度為 N, 時間複雜度達到 O(N)。
【難度】
尉:★★☆☆
【解答】
方法一:使用額外的儲存空間
這道題的難點在於我們需要定位好隨機指標,一個比較簡單的解法就是把原節點與複製的節點關聯起來,可以使用雜湊表把他們關聯起來。
首先把副節點全部建立出來,然後把原節點與對應的副節點用雜湊表關聯起來。關聯的時候原節點作為key,副節點作為value。例如對於連結串列 1->2->3->null。建立副節點 1', 2', 3'。然後用雜湊表關聯起來:
key | value |
---|---|
1 | 1' |
2 | 2' |
3 | 3' |
之後在把所有副節點連線成一個連結串列。在連線的時候,我們 可以透過雜湊表很容易這找到對應的隨機節點。
程式碼如下
1//方法1:採用雜湊表
2public static Node1 copyListWithRand(Node1 head) {
3 Map<Node1, Node1> map = new HashMap<>();
4 Node1 cur = head;
5 while (cur != null) {
6 map.put(cur, new Node1(cur.value));
7 cur = cur.next;
8 }
9 //把副節點連線起來
10 cur = head;
11 while (cur != null) {
12 map.get(cur).next = map.get(cur.next);
13 map.get(cur).rand = map.get(cur.rand);
14 cur = cur.next;
15 }
16 return map.get(head);
17}
這種方法的時間複雜度為 O(n), 空間複雜度也為 O(n)。
方法2
其實我們也可以不需要雜湊表來輔助,也就是說 ,我們是可以做到空間複雜度為 O(1)的,我們可以把複製的副節點插入到原連結串列中去,這樣也能把原節點與副節點進行關聯,進而
定位到隨機節點。例如,對於連結串列 1->2->3->null。首先生成副節點 1', 2', 3。然後把副節點插入到原節點的相鄰位置,即把原連結串列變成 1->1'->2->2'->3->3'->null。
這樣我們也可以在連線副節點的時候,找到相應的隨機節點。例如 1 的隨機節點是 3,則 1' 的隨機節點是 3'。顯然,1節點的隨機節點的下一個節點就是 1'的隨機節點。具體程式碼如下:
1//方法二
2public static Node1 copyListWithRand2(Node1 head){
3 Node1 cur = head;
4 Node1 next = null;
5
6 //把複製的節點插進去
7 while (cur != null) {
8 next = cur.next;
9 Node1 temp = new Node1(cur.value);//複製節點
10 temp.next = cur.next;
11 cur.next = temp;
12 cur = next;
13 }
14 //在一邊把複製的節點取出來一邊連線。
15 cur = head;
16 next = null;
17 while (cur != null) {
18 next = cur.next.next;//儲存原連結串列的下一個節點
19 cur.next.next = next != null ? next.next : null;
20 cur.next.rand = cur.rand != null ? cur.rand.next : null;
21 cur = next;
22 }
23 return head.next;
24}
採用這種方法的時候,由於隨機節點有可能是空指標,隨意寫程式碼的時候要注意。
問題擴充
思考:如果是有兩個隨機指標呢?又該如何處理呢?三個呢?
【題目描述】
無
【要求】
無
【難度】
未知。
【解答】
提醒:別想太多了,保持清醒。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31561266/viewspace-2284820/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 複製帶隨機指標的連結串列隨機指標
- 隨機連結串列的複製隨機
- LeetCode 複製帶隨機指標的連結串列LeetCode隨機指標
- (連結串列)連結串列的排序問題排序
- LeetCode-138-複製帶隨機指標的連結串列LeetCode隨機指標
- [連結串列]leetcode138-複製帶隨即指標的連結串列LeetCode指標
- 指標和連結串列指標
- 「複製帶隨機指標的連結串列」的一個很巧妙解法隨機指標
- Java連結串列指標確實好煩 - 交換連結串列中連續的兩個節點的位置Java指標
- 連結串列面試題(四)---查詢連結串列的中間節點面試題
- 利用快慢指標快速得到連結串列中間節點指標
- 面試題35:複雜連結串列的複製面試題
- 連結串列專題——面試中常見的連結串列問題面試
- c 連結串列之 快慢指標 查詢迴圈節點指標
- 連結串列面試題(二)---連結串列逆序(連結串列反轉)面試題
- LeetCode 138:複製帶隨機指標的連結串列 Copy List with Random PointerLeetCode隨機指標random
- Redis筆記 — 連結串列和連結串列節點的API函式(三)Redis筆記API函式
- 複習下C 連結串列操作(雙向迴圈連結串列,查詢迴圈節點)
- 【連結串列問題】打卡10:將搜尋二叉樹轉換成雙向連結串列二叉樹
- Day4(連結串列)|24. 兩兩交換連結串列中的節點 & 19.刪除連結串列的倒數第N個節點 & 面試題 02.07. 連結串列相交 &142.環形連結串列II面試題
- 【LeetCode連結串列#9】圖解:兩兩交換連結串列節點LeetCode圖解
- golang二級指標操作連結串列Golang指標
- 連結串列-雙向連結串列
- 連結串列-迴圈連結串列
- **24. 兩兩交換連結串列中的節點****19.刪除連結串列的倒數第N個節點****面試題 02.07. 連結串列相交****142.環形連結串列II**面試題
- 連結串列面試題(十一)---求帶環單連結串列 環的入口點面試題
- 帶頭結點的連結串列操作題
- 單連結串列的排序問題排序
- K個節點翻轉連結串列
- 雙向連結串列 尾節點插入
- 資料結構與演算法——連結串列 Linked List(單連結串列、雙向連結串列、單向環形連結串列-Josephu 問題)資料結構演算法
- 3.2資料結構之指標和連結串列 1748:約瑟夫問題資料結構指標
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素
- 連結串列面試題(十三)---求兩個都不帶環的連結串列相交的結點面試題
- 程式碼隨想錄第4天 | 24. 兩兩交換連結串列中的節點、19.刪除連結串列的倒數第N個節點、面試題 02.07. 連結串列相交、142.環形連結串列II面試題
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現