Advertisement
Nina-S

Untitled

Mar 11th, 2022
18
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.54 KB | None | 0 0
  1. let input = ["10 5", "10 2 1 6 8"];
  2.  
  3. let print = this.print || console.log;
  4.  
  5. let gets =
  6. this.gets ||
  7. (
  8. (arr, index) => () =>
  9. arr[index++]
  10. )(input, 0);
  11.  
  12. //LinkedListNode
  13. class LinkedListNode {
  14. constructor(value) {
  15. this.value = value;
  16. this.next = null;
  17. this.prev = null;
  18. }
  19. }
  20. //DoublyLinkedList
  21.  
  22. class DoublyLinkedList {
  23. constructor() {
  24. this.head = null;
  25. this.tail = null;
  26. this.count = 0;
  27. this.map = new Map();
  28. }
  29.  
  30. moveBefore(value1, value2) {
  31. let valueToMove = this.find(value1); //miro
  32. let staticValue = this.find(value2); //gosho
  33.  
  34. this.remove(valueToMove);
  35. this.insertBefore(staticValue, value1);
  36. }
  37.  
  38. moveAfter(value1, value2) {
  39. let valueToMove = this.find(value1); //miro
  40. let staticValue = this.find(value2); //gosho
  41.  
  42. this.remove(valueToMove);
  43. this.insertAfter(staticValue, value1);
  44. }
  45.  
  46. remove(node) {
  47. this.map.delete(node.value);
  48.  
  49. let firstNodePrevious = node.prev; //penka
  50. let firstNodeNext = node.next; //stanka
  51.  
  52. if (firstNodePrevious === null && firstNodeNext === null) {
  53. //do not handle
  54. } else if (firstNodePrevious === null) {
  55. firstNodeNext.prev = null;
  56. this.head = firstNodeNext;
  57. } else if (firstNodeNext === null) {
  58. firstNodePrevious.next = null;
  59. this.tail = firstNodePrevious;
  60. } else {
  61. firstNodePrevious.next = firstNodeNext; //penka.next = stanka
  62. firstNodeNext.prev = firstNodePrevious; //stanka.prev = penka
  63. }
  64. }
  65.  
  66. addLast(value) {
  67. let node = new LinkedListNode(value);
  68.  
  69. if (this.count === 0) {
  70. this.map.set(value, node);
  71. this.head = node;
  72. this.tail = node;
  73. } else {
  74. this.map.set(value, node);
  75. this.tail.next = node;
  76. node.prev = this.tail;
  77. this.tail = node;
  78. }
  79. this.count++;
  80. }
  81.  
  82. insertBefore(prevNode, value) {
  83. //insert an element with the given value before the given node
  84. let newNode = new LinkedListNode(value);
  85. this.count++;
  86.  
  87. this.map.set(value, newNode);
  88.  
  89. let tempPrevNode = prevNode;
  90. let previousNode = tempPrevNode.prev;
  91.  
  92. if (previousNode !== null) {
  93. newNode.next = tempPrevNode;
  94. tempPrevNode.prev = newNode;
  95. previousNode.next = newNode;
  96. newNode.prev = previousNode;
  97. } else {
  98. newNode.next = tempPrevNode;
  99. tempPrevNode.prev = newNode;
  100. newNode.prev = null;
  101. this.head = newNode;
  102. }
  103. }
  104.  
  105. insertAfter(prevNode, value) {
  106. // insert an element with the given value after the given node
  107. let newNode = new LinkedListNode(value);
  108. this.count++;
  109.  
  110. this.map.set(value, newNode);
  111.  
  112. let tempPrevNode = prevNode;
  113. let nextNode = prevNode.next;
  114.  
  115. if (nextNode !== null) {
  116. newNode.prev = tempPrevNode;
  117. tempPrevNode.next = newNode;
  118. newNode.next = nextNode;
  119. nextNode.prev = newNode;
  120. } else {
  121. newNode.prev = tempPrevNode;
  122. tempPrevNode.next = newNode;
  123. newNode.next = null;
  124. this.tail = newNode;
  125. }
  126. }
  127.  
  128. find(value) {
  129. // returns the first node that has the given value or undefined if no such value exists
  130. if (this.map.has(value)) {
  131. let node = this.map.get(value);
  132. return node;
  133. } else {
  134. return null;
  135. }
  136. }
  137.  
  138. values() {
  139. let values = [];
  140. let tempHead = this.head;
  141.  
  142. while (tempHead !== null) {
  143. values.push(tempHead.value);
  144. tempHead = tempHead.next;
  145. }
  146. return values;
  147. }
  148. }
  149.  
  150. //Solution
  151.  
  152. let list = new DoublyLinkedList();
  153.  
  154. let [numbers, countOfNumberToBeMoved] = gets()
  155. .split(" ")
  156. .map((el) => Number(el)); //7,4
  157.  
  158. //1,2,3,4,5,6,7
  159. for (let index = 1; index <= numbers; index++) {
  160. list.addLast(index);
  161. }
  162.  
  163. let numbersToBeMoved = gets().split(" "); //1 5 4 7
  164.  
  165. for (let index = 0; index < numbersToBeMoved.length; index++) {
  166. const number = Number(numbersToBeMoved[index]); //1
  167.  
  168. if (number % 2 == 0) {
  169. let after = number / 2;
  170. if (number === after) {
  171. continue;
  172. }
  173. //move the number after the after
  174. list.moveAfter(number, after);
  175. } else {
  176. let after = number * 2;
  177.  
  178. if (after >= numbers) {
  179. //move it after the numbers -> 7
  180. if (number === numbers) {
  181. continue;
  182. }
  183. list.moveAfter(number, numbers);
  184. } else {
  185. if (number === after) {
  186. continue;
  187. }
  188. //move the number after the after
  189. list.moveAfter(number, after);
  190. }
  191. }
  192.  
  193. //if number and after are the same - do nothing??
  194. }
  195. print(list.values().join(" "));
  196.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement