返回

用 JavaScript 实现链表

前端

前言

链表作为一种经典的数据结构,在计算机科学和软件开发领域有着广泛的应用。链表的实现方式有很多种,在JavaScript中,我们可以使用对象或数组来实现链表。本文将介绍两种用JavaScript实现链表的方法,分别基于对象和数组,并探讨它们的优缺点。

基于对象的链表实现

基于对象的链表实现方式是将链表的每个节点作为一个对象,节点对象包含两个属性:数据项和指向下一个节点的链接。以下是基于对象的链表实现示例:

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}

class LinkedList {
  constructor() {
    this.head = null;
    this.tail = null;
  }

  add(data) {
    const newNode = new Node(data);

    if (this.head === null) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }
  }

  remove(data) {
    let current = this.head;
    let previous = null;

    while (current !== null) {
      if (current.data === data) {
        if (previous === null) {
          this.head = current.next;
        } else {
          previous.next = current.next;
        }

        if (current === this.tail) {
          this.tail = previous;
        }

        break;
      }

      previous = current;
      current = current.next;
    }
  }

  find(data) {
    let current = this.head;

    while (current !== null) {
      if (current.data === data) {
        return current;
      }

      current = current.next;
    }

    return null;
  }

  print() {
    let current = this.head;

    while (current !== null) {
      console.log(current.data);

      current = current.next;
    }
  }
}

基于数组的链表实现

基于数组的链表实现方式是将链表的每个节点存储在一个数组中,数组的每个元素包含两个值:数据项和指向下一个节点的索引。以下是基于数组的链表实现示例:

class LinkedList {
  constructor() {
    this.data = [];
    this.next = [];
  }

  add(data) {
    this.data.push(data);
    this.next.push(this.data.length - 1);
  }

  remove(data) {
    const index = this.data.indexOf(data);

    if (index === -1) {
      return;
    }

    this.data.splice(index, 1);
    this.next.splice(index, 1);

    for (let i = index; i < this.next.length; i++) {
      this.next[i]--;
    }
  }

  find(data) {
    const index = this.data.indexOf(data);

    if (index === -1) {
      return null;
    }

    return this.data[index];
  }

  print() {
    for (let i = 0; i < this.data.length; i++) {
      console.log(this.data[i]);
    }
  }
}

比较

基于对象的链表实现和基于数组的链表实现各有优缺点。基于对象的链表实现更加直观,节点之间通过对象的引用相连接,但是需要更多的内存空间。基于数组的链表实现更加紧凑,内存占用更少,但是需要额外的数组来存储节点之间的链接。

总结

本文介绍了两种用JavaScript实现链表的方法,分别基于对象和数组。基于对象的链表实现更加直观,基于数组的链表实现更加紧凑。开发者可以根据具体需求选择合适的方法来实现链表。