javascript实现LinkedHashSet

226 阅读1分钟
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)