返回

深入浅出 图解JS链表结构

前端

深入浅出 图解JS链表结构

前言

链表是一种重要的数据结构,广泛应用于计算机科学和软件开发领域。链表的特点是其元素不是连续存储在内存中,而是通过指针相互连接。这意味着链表可以轻松地插入和删除元素,而不需要移动其他元素。

什么是链表

链表是由一组节点组成的数据结构,其中每个节点包含一个数据项和一个指针,指向下一个节点。链表中的第一个节点称为头节点,最后一个节点称为尾节点。

链表的优点

  • 链表的优点是插入和删除元素非常容易。这是因为链表中的元素不是连续存储在内存中,因此不需要移动其他元素来为新元素腾出空间。
  • 链表还非常适合存储可变长度的数据。例如,如果我们要存储一个字符串,那么我们可以使用链表来存储字符串的每个字符,并使用指针将这些字符连接起来。

链表的缺点

  • 链表的缺点是访问元素的效率较低。这是因为链表中的元素不是连续存储在内存中,因此计算机必须遍历链表才能找到所需元素。
  • 链表还可能存在内存碎片问题。这是因为当我们从链表中删除元素时,可能会留下一些空洞。这些空洞称为内存碎片,它们会浪费内存空间。

链表的应用

链表广泛应用于计算机科学和软件开发领域。一些常见的应用场景包括:

  • 存储字符串。链表非常适合存储可变长度的数据,因此经常被用来存储字符串。
  • 实现栈和队列。栈和队列都是线性数据结构,它们遵循先进先出(FIFO)或后进先出(LIFO)的原则。链表可以轻松地实现栈和队列,因为它们可以轻松地插入和删除元素。
  • 实现哈希表。哈希表是一种数据结构,它使用哈希函数将键映射到值。链表可以用来实现哈希表,因为它们可以轻松地插入和删除元素。

链表的实现

链表可以在多种编程语言中实现。下面我们以JavaScript为例,来介绍链表的实现。

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

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

  // 在链表头部插入元素
  insertAtHead(data) {
    const newNode = new Node(data);
    if (this.head === null) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      newNode.next = this.head;
      this.head = newNode;
    }
  }

  // 在链表尾部插入元素
  insertAtTail(data) {
    const newNode = new Node(data);
    if (this.tail === null) {
      this.head = newNode;
      this.tail = newNode;
    } else {
      this.tail.next = newNode;
      this.tail = newNode;
    }
  }

  // 从链表中删除元素
  delete(data) {
    if (this.head === null) {
      return;
    }

    if (this.head.data === data) {
      this.head = this.head.next;
      if (this.head === null) {
        this.tail = null;
      }
      return;
    }

    let current = this.head;
    while (current.next !== null) {
      if (current.next.data === data) {
        current.next = current.next.next;
        if (current.next === null) {
          this.tail = current;
        }
        return;
      }
      current = current.next;
    }
  }

  // 搜索链表中的元素
  search(data) {
    if (this.head === null) {
      return null;
    }

    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;
    }
  }
}

const linkedList = new LinkedList();
linkedList.insertAtHead(1);
linkedList.insertAtHead(2);
linkedList.insertAtTail(3);
linkedList.insertAtTail(4);
linkedList.delete(2);
linkedList.print();

输出结果:

1
3
4

结语

链表是一种重要的数据结构,它具有许多优点和缺点。链表非常适合存储可变长度的数据,并且可以轻松地插入和删除元素。但是,链表的访问效率较低,并且可能存在内存碎片问题。链表广泛应用于计算机科学和软件开发领域,包括存储字符串、实现栈和队列以及实现哈希表等。