class LinkedHashSet {
constructor() {
this.set = new Set();
this.head = null;
this.tail = null;
}
findFirstElement() {
return this.head;
}
size() {
let size = 0
let current = this.head
while (current !== null) {
size+=1
current = current.next;
}
return size
}
add(element) {
if (!this.set.has(element)) {
const entry = { element, prev: null, next: null };
if (this.head === null) {
this.head = entry;
this.tail = entry;
} else {
this.tail.next = entry;
entry.prev = this.tail;
this.tail = entry;
}
this.set.add(element);
}
}
delete(element) {
if (this.set.has(element)) {
const entry = this.findEntry(element);
if (entry.prev) {
entry.prev.next = entry.next;
} else {
this.head = entry.next;
}
if (entry.next) {
entry.next.prev = entry.prev;
} else {
this.tail = entry.prev;
}
this.set.delete(element);
}
}
has(element) {
return this.set.has(element);
}
forEach(callback) {
let current = this.head;
while (current !== null) {
callback(current.element);
current = current.next;
}
}
findEntry(element) {
let current = this.head;
while (current !== null) {
if (current.element === element) {
return current;
}
current = current.next;
}
return null;
}
toArray() {
const result = [];
this.forEach((element) => {
result.push(element);
});
return result;
}
}
let hashSet = new LinkedHashSet()
hashSet.add('a')
hashSet.add('b')
hashSet.add('c')
hashSet.add('d')
console.log(hashSet)
hashSet.delete('b')
console.log(hashSet)