1. 程式人生 > 實用技巧 >LeetCode 138. 複製帶隨機指標的連結串列

LeetCode 138. 複製帶隨機指標的連結串列

給定一個連結串列,每個節點包含一個額外增加的隨機指標,該指標可以指向連結串列中的任何節點或空節點。

要求返回這個連結串列的深拷貝。

我們用一個由n個節點組成的連結串列來表示輸入/輸出中的連結串列。每個節點用一個[val, random_index]表示:

val:一個表示Node.val的整數。
random_index:隨機指標指向的節點索引(範圍從0到n-1);如果不指向任何節點,則為null。

方法一:根據題目中提到的索引資訊,想到的方法。原節點→索引→新節點

    private Map<Node, Integer> nodeToIndex; // 原節點與索引的對映
    private
Map<Integer, Node> indexToNode; // 索引與新節點的對映 public Node copyRandomList(Node head) { if (head == null) { return null; } // 構建nodeToIndex nodeToIndex = new HashMap<Node, Integer>(); int key = 0; nodeToIndex.put(head, key); Node nextNode
= head.next; while(nextNode != null) { nodeToIndex.put(nextNode, ++key); nextNode = nextNode.next; } // 生成newHead(包含next關係),並構建indexToNode indexToNode = new HashMap<Integer, Node>(); key = 0; Node newHead = new Node(head.val); Node curNode
= newHead; nextNode = head.next; while(nextNode != null) { Node tempNode = new Node(nextNode.val); curNode.next = tempNode; indexToNode.put(key++, curNode); curNode = curNode.next; nextNode = nextNode.next; } curNode.next = null; indexToNode.put(key, curNode); // 根據nodeToIndex與indexToNode,獲取newHead連結串列的random資訊 curNode = newHead; while(head != null) { if (head.random != null) { key = nodeToIndex.get(head.random); curNode.random = indexToNode.get(key); } curNode = curNode.next; head = head.next; } return newHead; }

方法二:先建立新節點,直接構建舊節點與新節點的對映關係,不考慮中間索引資訊。原節點→新節點

    private Map<Node, Node> map;
public Node copyRandomList(Node head) { if (head == null) { return null; } // 構建原節點與copy節點的對映map map = new HashMap<>(); Node node = head; while(node != null) { Node copyNode = new Node(node.val); map.put(node, copyNode); node = node.next; } // 根據map獲取next和random。 copy節點的next/random是原節點的next/random所對應的value值。 Node copyHead = map.get(head); node = head; while (node != null) { map.get(node).next = map.get(node.next); map.get(node).random = map.get(node.random); node = node.next; } return copyHead; }