@d1g1tal/collections
Version:
JavaScript Collections ES Modules
3 lines (2 loc) • 2.5 kB
JavaScript
import{Node as l}from"./node";class n{$head=null;$tail=null;$size=0;$doublyLinked;static Type={Singly:"singly",Doubly:"doubly"};constructor(e=n.Type.Singly){this.$doublyLinked=e==n.Type.Doubly}addFirst(e){const t=new l({next:this.$head,value:e});this.$doublyLinked&&this.$head&&(this.$head.previous=t),this.$head=t,this.$tail||(this.$tail=t),this.$size++}addLast(e){const t=new l({value:e,previous:this.$doublyLinked?this.$tail:null});this.$tail&&(this.$tail.next=t),this.$tail=t,this.$head||(this.$head=t),this.$size++}getFirst(){return this.$head?.value??null}getLast(){return this.$tail?.value??null}removeFirst(){return this.removeNode(this.$head)}removeLast(){return this.removeNode(this.$tail)}remove(e){for(let t=this.$head;t;t=t.next)if(t.value===e)return this.removeNode(t);return null}get(e){return this.getNodeAt(e)?.value??null}set(e,t){const i=this.getNodeAt(e);if(!i)throw new RangeError("Index out of bounds");i.value=t}insert(e,t){if(e<0||e>this.$size)throw new RangeError("Index out of bounds");if(e===0)this.addFirst(t);else if(e===this.$size)this.addLast(t);else{const i=this.getNodeAt(e-1);i.next=new l({value:t,previous:this.$doublyLinked?i:null,next:i.next}),this.$size++}}contains(e){for(let t=this.$head;t;t=t.next)if(t.value===e)return!0;return!1}reverse(){let e=this.$head,t=null;for(;e;){const i=e.next;e.next=t,t&&(t.previous=e),t=e,e=i}[this.$head,this.$tail]=[this.$tail,this.$head]}clear(){for(let e=this.$head;e;e=e.next)e.unlink();this.$head=this.$tail=null,this.$size=0}isEmpty(){return this.$size===0}indexOf(e){for(let t=0,i=this.$head;i;i=i.next,t++)if(i.value===e)return t;return-1}forEach(e,t=this){for(let i=0,s=this.$head;s;s=s.next,i++)e.call(t,s.value,i,this)}*values(){yield*this}get size(){return this.$size}toArray(){return Array.from(this.values())}*[Symbol.iterator](){for(let e=this.$head;e;e=e.next)yield e.value}get[Symbol.toStringTag](){return"LinkedList"}getNodeAt(e){if(e<0||e>=this.$size)return null;let t=null;if(this.$doublyLinked&&e>=this.$size/2){t=this.$tail;for(let i=this.$size-1;i>e;i--)t=t.previous}else{t=this.$head;for(let i=0;i<e;i++)t=t.next}return t}removeNode(e){if(e===null)return null;const t=e.value;return e===this.$head&&e===this.$tail?this.$head=this.$tail=null:e===this.$head?this.$head=e.next:e===this.$tail?(this.$tail=this.$doublyLinked?e.previous:null,this.$tail&&(this.$tail.next=null)):e.unlink(),this.$size--,this.$size===1&&(this.$tail=this.$head),t}}export{n as LinkedList};
//# sourceMappingURL=linked-list.js.map