// This is an input class. Do not edit. class Node { constructor(value) { this.value = value; this.prev = null; this.next = null; } } // Feel free to add new properties and methods to the class. class DoublyLinkedList { constructor() { this.head = null; this.tail = null; } setHead(node) { // node is the only node if (!this.head) { this.head = node this.tail = node } else { this.insertBefore(this.head, node); } } setTail(node) { if (!this.head) { this.setHead(node) } else { this.insertAfter(this.tail, node) } } insertBefore(node, nodeToInsert) { // only one node if (nodeToInsert === this.head && nodeToInsert === this.tail) { return; } this.remove(nodeToInsert); nodeToInsert.prev = node.prev; nodeToInsert.next = node; if (!node.prev) { this.head = nodeToInsert } else { node.prev.next = nodeToInsert } node.prev = nodeToInsert } insertAfter(node, nodeToInsert) { // only one node if (nodeToInsert === this.head && nodeToInsert === this.tail) { return; } this.remove(nodeToInsert); nodeToInsert.prev = node; nodeToInsert.next = node.next; if (!node.next) { this.tail = nodeToInsert } else { node.next.prev = nodeToInsert } node.next = nodeToInsert } insertAtPosition(position, nodeToInsert) { // if position = 1 if (this.position === 1) { this.setHead(nodeToInsert) } else { let current = this.head; let currentPosition = 1; while (current !== null && currentPosition !== position) { current = current.next; currentPosition++ } if (current === null) { this.setTail(nodeToInsert) } if (currentPosition === position) { this.insertBefore(current, nodeToInsert) } } } removeNodesWithValue(value) { let current = this.head; while(current) { // set it earlier const nodeToRemove = current; current = current.next; if (nodeToRemove.value === value) { this.remove(nodeToRemove) } } } remove(node) { // check head if (this.head === node) { this.head = this.head.next; } if (this.tail === node) { // check tail this.tail = this.tail.prev; } this.removeNodeBindings(node) } removeNodeBindings(node) { const prevNode = node.prev const nextNode = node.next if (prevNode) { prevNode.next = nextNode } if(nextNode) { nextNode.prev = prevNode } node.prev = null; node.next = null; } containsNodeWithValue(value) { let current = this.head; while(current !== null && current.value !== value) { current = current.next; } return current !== null; } } // Do not edit the lines below. exports.Node = Node; exports.DoublyLinkedList = DoublyLinkedList;