-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathcopy-linked-list-with-arbitrary-pointer.js
84 lines (72 loc) · 2.13 KB
/
copy-linked-list-with-arbitrary-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
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
let deep_copy_arbitrary_pointer = function(head) {
if (!head) {
return null;
}
let current = head;
let new_head = null;
let new_prev = null;
let ht = new Map();
// create copy of the linked list, recording the corresponding
// nodes in hashmap without updating arbitrary pointer
while (current) {
let new_node = new LinkedListNode(current.data);
// copy the old arbitrary pointer in the new node
new_node.arbitrary = current.arbitrary;
if (new_prev) {
new_prev.next = new_node;
} else {
new_head = new_node;
}
ht.set(current, new_node);
new_prev = new_node;
current = current.next;
}
let new_current = new_head;
// updating arbitrary pointer
while (new_current) {
if (new_current.arbitrary) {
let node = ht.get(new_current.arbitrary);
new_current.arbitrary = node;
}
new_current = new_current.next;
}
return new_head;
};
let create_linked_list_with_arb_pointers = function(length) {
let head = create_random_linked_list(length);
let v = [];
let temp = head;
while (temp) {
v.push(temp);
temp = temp.next;
}
for (let i = 0; i < v.length; i++) {
let j = Math.floor(Math.random() * (v.length - 1));
let p = Math.floor(Math.random() * 100);
if (p < 75) {
v[i].arbitrary = v[j];
}
}
return head;
};
let print_with_arb_pointers = function(head) {
let printed_result = '';
while (head) {
let temp = '';
if (head.arbitrary) {
temp += head.arbitrary.data;
}
printed_result += " (" + temp + "), ";
head = head.next;
}
console.log(printed_result);
};
console.log("");
console.log("");
console.log("+++++++++++++++++++++++++++++++++++++++");
console.log("Deep Copy Arbitrary Pointers");
console.log("---------------------------------------");
let head = create_linked_list_with_arb_pointers(12);
print_with_arb_pointers(head);
let head2 = deep_copy_arbitrary_pointer(head);
print_with_arb_pointers(head2);