|
@@ -0,0 +1,75 @@
|
|
|
|
+'use strict'
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Definition for singly-linked list with a random pointer.
|
|
|
|
+ * function RandomListNode(label) {
|
|
|
|
+ * this.label = label
|
|
|
|
+ * this.next = this.random = null
|
|
|
|
+ * }
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+function RandomListNode(label) {
|
|
|
|
+ this.label = label
|
|
|
|
+ this.next = this.random = null
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * @param {RandomListNode} head
|
|
|
|
+ * @return {RandomListNode}
|
|
|
|
+ */
|
|
|
|
+var copyRandomList = function (head) {
|
|
|
|
+ if (head === null) return null
|
|
|
|
+ const newHead = new RandomListNode(head.label)
|
|
|
|
+ const map = new Map()
|
|
|
|
+ if (head.random !== null) {
|
|
|
|
+ if (map.has(head.random))
|
|
|
|
+ map.get(head.random).push(newHead)
|
|
|
|
+ else
|
|
|
|
+ map.set(head.random, [newHead])
|
|
|
|
+ }
|
|
|
|
+ let prev = newHead
|
|
|
|
+ let curr = head.next
|
|
|
|
+ while (curr !== null) {
|
|
|
|
+ const node = new RandomListNode(curr.label)
|
|
|
|
+ prev.next = node
|
|
|
|
+ if (curr.random !== null) {
|
|
|
|
+ if (map.has(curr.random))
|
|
|
|
+ map.get(curr.random).push(node)
|
|
|
|
+ else
|
|
|
|
+ map.set(curr.random, [node])
|
|
|
|
+ }
|
|
|
|
+ prev = node
|
|
|
|
+ curr = curr.next
|
|
|
|
+ }
|
|
|
|
+ if (map.size != 0) {
|
|
|
|
+ for (curr = head, prev = newHead; curr !== null; curr = curr.next, prev = prev.next) {
|
|
|
|
+ if (map.has(curr))
|
|
|
|
+ for (const n of map.get(curr)) n.random = prev
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ return newHead
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+function __main__() {
|
|
|
|
+ /* eslint no-console: ["error", {"allow": ["log"]}] */
|
|
|
|
+ const logger = console.log.bind(console)
|
|
|
|
+ const n5 = new RandomListNode(5)
|
|
|
|
+ const n4 = new RandomListNode(4)
|
|
|
|
+ const n3 = new RandomListNode(3)
|
|
|
|
+ const n2 = new RandomListNode(2)
|
|
|
|
+ const n1 = new RandomListNode(1)
|
|
|
|
+ n1.next = n2
|
|
|
|
+ n2.next = n3
|
|
|
|
+ n3.next = n4
|
|
|
|
+ n4.next = n5
|
|
|
|
+ n1.random = n4
|
|
|
|
+ n2.random = n1
|
|
|
|
+ n3.random = n5
|
|
|
|
+ n4.random = null
|
|
|
|
+ n5.random = n3
|
|
|
|
+ const n = copyRandomList(n1)
|
|
|
|
+ logger(n)
|
|
|
|
+ logger(n1)
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+__main__()
|