返回

从0认识 JavaScript 算法:单向链表

前端

在计算机科学中,数据结构是用于组织和存储数据的抽象方式。链表和数组一样,可以用于存储一系列的元素,但是链表和数组的实现机制完全不同。

  • 存储多个元素,数组(或列表)可能是最常用的数据结构。几乎每一种编程语言都有默认实现数组结构,提供了一个便利的 [] 语法来访问数组元素。数组的创建需要申请一段连续的内存空间(一整块内存),并且大小固定。这意味着一旦数组创建,就不能更改其大小。

  • 相比之下,链表是一种更加灵活的数据结构。链表的每个元素都是一个独立的节点,包含两个信息:数据本身和指向下一个节点的指针。这样,链表中的元素可以存储在内存的不同位置,而不需要连续的内存块。

单向链表是链表中最简单的一种。单向链表中的每个节点只包含一个指向下一个节点的指针,因此链表中的元素只能从头到尾遍历。

单向链表的实现

用 JavaScript 实现单向链表非常简单。我们可以使用以下代码创建一个单向链表:

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

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

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

    if (!this.head) {
      this.head = node;
      this.tail = node;
    } else {
      this.tail.next = node;
      this.tail = node;
    }
  }

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

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

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

        break;
      }

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

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

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

      current = current.next;
    }

    return false;
  }

  print() {
    let current = this.head;

    while (current) {
      console.log(current.data);
      current = current.next;
    }
  }
}

这个单向链表类包含四个方法:

  • add():将一个元素添加到链表的尾部。

  • remove():从链表中删除一个元素。

  • search():在链表中搜索一个元素。

  • print():打印链表中的所有元素。

单向链表的时间复杂度

单向链表的时间复杂度主要取决于链表的长度。

  • add():O(1)

  • remove():O(n)

  • search():O(n)

  • print():O(n)

单向链表的应用

单向链表是一种非常有用的数据结构,可以用于许多不同的应用中,例如:

  • 栈和队列的实现

  • 图的表示

  • 编译器和解释器的实现

  • 操作系统中的进程管理

  • 数据库中的索引

总结

单向链表是一种简单但强大的数据结构,可以用于许多不同的应用中。它是一种很好的数据结构,可以帮助您学习更复杂的算法和数据结构。