UNPKG

ds-algo-study

Version:

Just experimenting with publishing a package

157 lines (129 loc) 2.46 kB
class Node { constructor(data, next = null) { this.data = data; this.next = next; } } class LinkedList { constructor() { this.head = null; } insertFirst(data) { this.head = new Node(data, this.head); } size() { let counter = 0; let node = this.head; while (node) { counter++; node = node.next; } return counter; } getFirst() { return this.head; } getLast() { if (!this.head) { return null; } let node = this.head; while (node) { if (!node.next) { return node; } node = node.next; } } clear() { this.head = null; } removeFirst() { if (!this.head) { return; } this.head = this.head.next; } removeLast() { if (!this.head) { return; } if (!this.head.next) { this.head = null; return; } let previous = this.head; let node = this.head.next; while (node.next) { previous = node; node = node.next; } previous.next = null; } insertLast(data) { const last = this.getLast(); if (last) { // There are some existing nodes in our chain last.next = new Node(data); } else { // The chain is empty! this.head = new Node(data); } } getAt(index) { let counter = 0; let node = this.head; while (node) { if (counter === index) { return node; } counter++; node = node.next; } return null; } removeAt(index) { if (!this.head) { return; } if (index === 0) { this.head = this.head.next; return; } const previous = this.getAt(index - 1); if (!previous || !previous.next) { return; } previous.next = previous.next.next; } insertAt(data, index) { if (!this.head) { this.head = new Node(data); return; } if (index === 0) { this.head = new Node(data, this.head); return; } const previous = this.getAt(index - 1) || this.getLast(); const node = new Node(data, previous.next); previous.next = node; } forEach(fn) { let node = this.head; let counter = 0; while (node) { fn(node, counter); node = node.next; counter++; } } *[Symbol.iterator]() { let node = this.head; while (node) { yield node; node = node.next; } } } module.exports = { Node, LinkedList };