[連結串列]leetcode138-複製帶隨即指標的連結串列
[連結串列]–複製帶隨即指標的連結串列
題目連結
相同題目
題目
給定一個連結串列,每個節點包含一個額外增加的隨機指標,該指標可以指向連結串列中的任何節點或空節點。
要求返回這個連結串列的 深拷貝。
我們用一個由 n 個節點組成的連結串列來表示輸入/輸出中的連結串列。每個節點用一個 [val, random_index] 表示:
val:一個表示 Node.val 的整數。
random_index:隨機指標指向的節點索引(範圍從 0 到 n-1);如果不指向任何節點,則為 null 。
示例
輸入:head = [[7,null],[13,0],[11,4],[10,2],[1,0]]
輸出:[[7,null],[13,0],[11,4],[10,2],[1,0]]
輸入:head = [[1,1],[2,1]]
輸出:[[1,1],[2,1]]
解析
看起來很複雜,其實簡單
- 首先定義一個 map,key-value用於存放舊-新連結串列的地址
- 新連結串列地址怎麼獲取?不論怎樣變 node.val 都是一樣的,所以根據這個節點的值 new;
- 存放好以後就要開始複製了:需要複製的是每個節點的 next 和 random,一個新節點的 next 就是舊節點的 next 所對應的 value(地址),同樣的,一個新節點的 random 就是舊節點的 random 所對應的 value(地址)。畫圖很明顯。
(1)map.get(cur).next = map.get(cur.next);
(2)map.get(cur).random = map.get(cur.random);
程式碼實現
public class Solution138 {
/**
* Definition for a node
*/
class Node {
int val;
Node next;
Node random;
public Node(int val) {
this.val = val;
this.next = null;
this.random = null;
}
}
/**
* 兩次 map: 一次存放, 一次獲取
* 00 11 22 33 44
* 0 1 2 3 4
* null 22 33 null 44
* 1.存放
* key 00 11 22 33 44
* value aa bb cc dd ee
* 2.獲取
* map.get(cur).next = map.get(cur.next);
* map.get(cur).random = map.get(cur.random);
*/
public Node copyRandomList(Node head) {
Map<Node, Node> map = new HashMap<>();
// 存放
Node cur = head;
while (cur != null) {
map.put(cur, new Node(cur.val));
cur = cur.next;
}
// 獲取
cur = head;
while (cur != null) {
map.get(cur).next = map.get(cur.next);
map.get(cur).random = map.get(cur.random);
cur = cur.next;
}
return map.get(head);
}
}
-----------------------------------------------------------------------------有始有終分割線----------------------------------------------------------------------------------
相關文章
- LeetCode 複製帶隨機指標的連結串列LeetCode隨機指標
- 隨機連結串列的複製隨機
- LeetCode-138-複製帶隨機指標的連結串列LeetCode隨機指標
- 【連結串列問題】打卡8:複製含有隨機指標節點的連結串列隨機指標
- 「複製帶隨機指標的連結串列」的一個很巧妙解法隨機指標
- LeetCode 138:複製帶隨機指標的連結串列 Copy List with Random PointerLeetCode隨機指標random
- 複雜連結串列的複製
- JZ-025-複雜連結串列的複製
- 連結串列-迴圈連結串列
- 連結串列-雙向連結串列
- 連結串列 - 單向連結串列
- 【程式碼隨想錄】二、連結串列:2、設計連結串列
- 【程式碼隨想錄】二、連結串列:1、移除連結串列元素
- 連結串列4: 迴圈連結串列
- 連結串列-單連結串列實現
- 連結串列-雙向通用連結串列
- 面試題35:複雜連結串列的複製面試題
- 程式碼隨想錄第3天 | 連結串列 203.移除連結串列元素,707.設計連結串列,206.反轉連結串列
- 連結串列-雙向非通用連結串列
- 【LeetCode】->連結串列->通向連結串列自由之路LeetCode
- 連結串列入門與插入連結串列
- Leetcode_86_分割連結串列_連結串列LeetCode
- 劍指 Offer 35. 複雜連結串列的複製
- 複雜連結串列的復刻
- 資料結構-單連結串列、雙連結串列資料結構
- 連結串列
- LeetCode-Python-86. 分隔連結串列(連結串列)LeetCodePython
- 隨想錄day3:203.移除連結串列元素|707.設計連結串列 |206.反轉連結串列
- 反轉連結串列、合併連結串列、樹的子結構
- 單連結串列建立連結串列出現問題
- 連結串列的ADT
- **203.移除連結串列元素****707.設計連結串列****206.反轉連結串列**
- 連結串列逆序
- 2、連結串列
- 連結串列(python)Python
- 重排連結串列
- (一)連結串列
- 分割連結串列