123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- '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__()
|