[連結串列]leetcode138-複製帶隨即指標的連結串列

Deep-Cola發表於2020-12-12

[連結串列]–複製帶隨即指標的連結串列


題目連結

leetcode 138.複製帶隨即指標的連結串列

相同題目

Offer 35.複雜連結串列的複製

題目

給定一個連結串列,每個節點包含一個額外增加的隨機指標,該指標可以指向連結串列中的任何節點或空節點。
要求返回這個連結串列的 深拷貝。
我們用一個由 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]]

解析

看起來很複雜,其實簡單

  1. 首先定義一個 map,key-value用於存放舊-新連結串列的地址
  2. 新連結串列地址怎麼獲取?不論怎樣變 node.val 都是一樣的,所以根據這個節點的值 new;
  3. 存放好以後就要開始複製了:需要複製的是每個節點的 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);
    }
}

-----------------------------------------------------------------------------有始有終分割線----------------------------------------------------------------------------------

相關文章