js(JavaScript)数据结构之链表(Linked List)

发布时间:2024年01月12日

什么是数据结构?

下面是维基百科的解释:

数据结构是计算机存储、组织数据的方式。数据结构意味着接口或封装:一个数据结构可被视为两个函数之间的接口,或者是由数据类型联合组成的存储内容的访问方法封装。

我们每天的编码中都会用到数据结构,下面是常见的数据结构:

  • 数组(Array)
  • 栈(Stack)
  • 队列(Queue)
  • 链表(Linked List)
  • 散列表(Hash)
  • 字典
  • 树(Tree)
  • 图(Graph)
  • 堆(Heap)

链表(Linked List)

链表(Linked List)是一种常见的数据结构,它由一系列节点组成,每个节点都包含了数据和指向下一个节点的指针。

链表也是一种列表,已经设计了数组,为什么需要链表呢?
JS中的数组实现效率比C++和Java低是因为它被实现为对象。
如果发现使用数组效率很低,可以考虑使用链表来替代。

举个例子,假设我们正在创建一个存储学生信息的链表。每个学生的信息包括姓名和年龄。你可以想象链表的每个节点都代表一个学生,其中节点的数据部分存储学生的姓名和年龄,而指针部分指向下一个学生的节点。

让我们用一种通俗易懂的方式来描述一下链表的基本操作:

  1. 创建链表:
    首先,你需要创建一个指向链表头部的指针,通常称之为 “head”。初始情况下,链表为空,所以头指针指向 null。

  2. 插入节点:
    要插入一个新节点,你需要先创建一个新的节点,并分配内存来存储数据。然后,将新节点的指针指向链表中的下一个节点,再将上一个节点的指针指向新节点。这样就完成了节点的插入操作。

  3. 删除节点:
    要删除一个节点,首先找到要删除的节点,并将上一个节点的指针指向要删除节点的下一个节点。然后释放删除节点的内存空间。

  4. 遍历链表:
    要遍历链表,你可以从头指针开始,依次访问每个节点。可以使用循环来逐个访问节点,并处理节点中的数据。

链表与数组相比,具有动态性和灵活性。在选择数据结构时,需要根据具体的使用场景来考虑。

参考案例

实现一个链表可以使用 JavaScript 中的对象和函数来实现。链表由节点组成,每个节点包含两个部分:数据和指向下一个节点的指针。链表的头部由一个指向第一个节点的指针组成。

首先,我们定义一个构造函数 ListNode,用于创建链表节点。该函数包含一个 data 属性和一个 next 属性,分别用于存储节点的数据和指向下一个节点的指针。

接着,我们定义一个 createLinkedList 函数,用于创建链表。该函数包含三个方法:insertNode、deleteNode 和 traverseLinkedList,分别用于插入节点、删除节点和遍历链表。

在 insertNode 方法中,我们首先创建一个新的节点,并将其添加到链表的末尾。如果链表为空,则将头指针直接指向新节点。否则,我们遍历链表,找到最后一个节点,然后将新节点添加到其后面。

在 deleteNode 方法中,我们首先检查链表是否为空。如果是,则直接返回。如果要删除的节点是头节点,则将头指针指向下一个节点即可。否则,我们遍历链表,找到要删除的节点,然后将前一个节点的指针跳过当前节点,指向下一个节点。

在 traverseLinkedList 方法中,我们遍历链表,输出每个节点的数据。

最后,我们创建一个链表实例,插入节点并删除节点,然后遍历链表,输出每个节点的数据。

具体的实现过程可以参考下面的 HTML 代码和 JavaScript 代码:

<!DOCTYPE html>
<html>
  <head>
    <meta ch****t="UTF-8" />
    <title>JavaScript 链表示例</title>
  </head>
  <body>
 <script>
    // 定义链表节点的构造函数
    function ListNode(data) {
      this.data = data; // 节点数据
      this.next = null; // 下一个节点的指针,默认为空
    }

    // 创建链表的函数
    function createLinkedList() {
      var head = null; // 链表头指针

      // 插入节点的函数
      function insertNode(data) {
        var newNode = new ListNode(data);
        if (head === null) {
          // 如果链表为空,直接将头指针指向新节点
          head = newNode;
        } else {
          // 遍历链表,找到最后一个节点
          var currentNode = head;
          while (currentNode.next !== null) {
            currentNode = currentNode.next;
          }
          // 将新节点添加到最后一个节点的后面
          currentNode.next = newNode;
        }
      }

      // 删除节点的函数
      function deleteNode(data) {
        if (head === null) {
          return; // 链表为空,直接返回
        }
        if (head.data === data) {
          // 如果要删除的节点是头节点
          head = head.next; // 将头指针指向下一个节点
          return;
        }
        var currentNode = head;
        var prevNode = null;
        while (currentNode !== null && currentNode.data !== data) {
          prevNode = currentNode;
          currentNode = currentNode.next;
        }
        if (currentNode === null) {
          return; // 没有找到要删除的节点
        }
        // 将前一个节点的指针跳过当前节点,指向下一个节点
        prevNode.next = currentNode.next;
      }

      // 遍历链表的函数
      function traverseLinkedList() {
        var currentNode = head;
        while (currentNode !== null) {
          console.log(currentNode.data);
          currentNode = currentNode.next;
        }
      }

      return {
        insertNode,
        deleteNode,
        traverseLinkedList,
      };
    }

    // 创建一个链表实例
    var linkedList = createLinkedList();

    // 插入节点
    linkedList.insertNode("星辰");
    linkedList.insertNode("迷上");
    linkedList.insertNode("大海");

    // 删除节点
    linkedList.deleteNode("迷上");

    // 遍历链表
    linkedList.traverseLinkedList();
  </script>
  </body>
</html>

在浏览器中打开该 HTML 文件,可以看到控制台输出 星辰大海,说明链表的插入和删除操作都成功了。

持续学习总结记录中,回顾一下上面的内容:
链表(Linked List)是一种常见的数据结构,它由一系列节点组成,每个节点都包含了数据和指向下一个节点的指针。
创建链表: 首先,你需要创建一个指向链表头部的指针,通常称之为 “head”。初始情况下,链表为空,所以头指针指向 null。
插入节点: 要插入一个新节点,你需要先创建一个新的节点,并分配内存来存储数据。然后,将新节点的指针指向链表中的下一个节点,再将上一个节点的指针指向新节点。这样就完成了节点的插入操作。
删除节点: 要删除一个节点,首先找到要删除的节点,并将上一个节点的指针指向要删除节点的下一个节点。然后释放删除节点的内存空间。
遍历链表: 要遍历链表,你可以从头指针开始,依次访问每个节点。可以使用循环来逐个访问节点,并处理节点中的数据。

文章来源:https://blog.csdn.net/qq_37255976/article/details/134462191
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。