138.js 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. 'use strict'
  2. /**
  3. * Definition for singly-linked list with a random pointer.
  4. * function RandomListNode(label) {
  5. * this.label = label
  6. * this.next = this.random = null
  7. * }
  8. */
  9. function RandomListNode(label) {
  10. this.label = label
  11. this.next = this.random = null
  12. }
  13. /**
  14. * @param {RandomListNode} head
  15. * @return {RandomListNode}
  16. */
  17. var copyRandomList = function (head) {
  18. if (head === null) return null
  19. const newHead = new RandomListNode(head.label)
  20. const map = new Map()
  21. if (head.random !== null) {
  22. if (map.has(head.random))
  23. map.get(head.random).push(newHead)
  24. else
  25. map.set(head.random, [newHead])
  26. }
  27. let prev = newHead
  28. let curr = head.next
  29. while (curr !== null) {
  30. const node = new RandomListNode(curr.label)
  31. prev.next = node
  32. if (curr.random !== null) {
  33. if (map.has(curr.random))
  34. map.get(curr.random).push(node)
  35. else
  36. map.set(curr.random, [node])
  37. }
  38. prev = node
  39. curr = curr.next
  40. }
  41. if (map.size != 0) {
  42. for (curr = head, prev = newHead; curr !== null; curr = curr.next, prev = prev.next) {
  43. if (map.has(curr))
  44. for (const n of map.get(curr)) n.random = prev
  45. }
  46. }
  47. return newHead
  48. }
  49. function __main__() {
  50. /* eslint no-console: ["error", {"allow": ["log"]}] */
  51. const logger = console.log.bind(console)
  52. const n5 = new RandomListNode(5)
  53. const n4 = new RandomListNode(4)
  54. const n3 = new RandomListNode(3)
  55. const n2 = new RandomListNode(2)
  56. const n1 = new RandomListNode(1)
  57. n1.next = n2
  58. n2.next = n3
  59. n3.next = n4
  60. n4.next = n5
  61. n1.random = n4
  62. n2.random = n1
  63. n3.random = n5
  64. n4.random = null
  65. n5.random = n3
  66. const n = copyRandomList(n1)
  67. logger(n)
  68. logger(n1)
  69. }
  70. __main__()