Nina-S

Untitled

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