class DoublyLinkedListNode<T> {
value: T;
next: DoublyLinkedListNode<T> | null;
prev: DoublyLinkedListNode<T> | null;
constructor(
value: T,
next: DoublyLinkedListNode<T> | null = null,
prev: DoublyLinkedListNode<T> | null = null,
) {
this.value = value;
this.next = next;
this.prev = prev;
}
}
class DoublyLinkedList<T> {
head = new DoublyLinkedListNode<T>(null as T);
size = 0;
find(value: T): DoublyLinkedListNode<T> | null {
let node = this.head.next;
while (node) {
if (node.value === value) return node;
node = node.next;
}
return null;
}
insert(node: DoublyLinkedListNode<T>, position: DoublyLinkedListNode<T>): void {
const next = position.next;
node.next = next;
node.prev = position;
position.next = node;
if (next) next.prev = node;
this.size += 1;
}
delete(node: DoublyLinkedListNode<T>): boolean {
const before = node.prev;
if (!before) return false;
before.next = node.next;
if (node.next) node.next.prev = before;
this.size -= 1;
return true;
}
}