-
Notifications
You must be signed in to change notification settings - Fork 19
/
Copy path0138-copy-list-with-random-pointer.js
61 lines (55 loc) · 1.97 KB
/
0138-copy-list-with-random-pointer.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
/**
* 138. Copy List with Random Pointer
* https://leetcode.com/problems/copy-list-with-random-pointer/
* Difficulty: Medium
*
* A linked list of length n is given such that each node contains an additional random pointer,
* which could point to any node in the list, or null.
*
* Construct a deep copy of the list. The deep copy should consist of exactly n brand new nodes,
* where each new node has its value set to the value of its corresponding original node. Both
* the next and random pointer of the new nodes should point to new nodes in the copied list such
* that the pointers in the original list and copied list represent the same list state. None of
* the pointers in the new list should point to nodes in the original list.
*
* For example, if there are two nodes X and Y in the original list, where X.random --> Y, then
* for the corresponding two nodes x and y in the copied list, x.random --> y.
*
* Return the head of the copied linked list.
*
* The linked list is represented in the input/output as a list of n nodes. Each node is
* represented as a pair of [val, random_index] where:
* - val: an integer representing Node.val
* - random_index: the index of the node (range from 0 to n-1) that the random pointer points
* to, or null if it does not point to any node.
*
* Your code will only be given the head of the original linked list.
*/
/**
* // Definition for a Node.
* function Node(val, next, random) {
* this.val = val;
* this.next = next;
* this.random = random;
* };
*/
/**
* @param {Node} head
* @return {Node}
*/
var copyRandomList = function(head) {
const map = new Map();
function copy(reference) {
if (reference === null) return null;
const instance = map.get(reference);
if (instance) {
return instance;
}
const node = new Node(reference.val);
map.set(reference, node);
node.next = copy(reference.next);
node.random = copy(reference.random);
return node;
}
return copy(head);
};