使用JavaScript实现链表的数据结构的代码

要使用JavaScript实现链表数据结构,需要考虑以下几个方面:

  1. 链表的基本结构
  2. 链表的基本操作(插入、删除、遍历等)
  3. JavaScript 实现数据结构的具体步骤

下面我将逐一阐述。

链表的基本结构

链表是由一系列节点所组成的数据结构,每个节点都保存着下一个节点的引用关系。链表可以是单向的,也可以是双向的。单向链表的节点只有指向下一个节点的指针,而双向链表的节点则同时有指向下一个节点和上一个节点的指针。

通常我们用一个类来表示链表的节点,这个类至少包括以下两个属性:

class Node {
  constructor(data) {
    this.data = data;
    this.next = null;
  }
}
  • data:存储节点的数据
  • next:指向下一个节点的指针

链表的基本操作

链表的基本操作包括插入、删除和遍历。下面我们分别看一下每个操作的实现。

插入

链表的插入操作一般有两种情况:

  1. 在某个节点之后插入一个节点
  2. 在链表的头部插入一个节点

在某个节点之后插入一个节点

在某个节点之后插入一个节点,需要先找到这个节点,然后将新节点的 next 指向这个节点的后继节点,然后将这个节点的 next 指向新节点。

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

  // 在某个节点之后插入一个节点
  insertAfter(targetNode, newNode) {
    newNode.next = targetNode.next;
    targetNode.next = newNode;
  }
}

在链表的头部插入一个节点

在链表的头部插入一个节点,只需要将新节点的 next 指向链表的头节点,然后让新节点成为链表的头节点即可。

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

  // 在链表的头部插入一个节点
  insertAtHead(newNode) {
    newNode.next = this.head;
    this.head = newNode;
  }
}

删除

链表的删除操作也分为两种情况:

  1. 删除某个节点
  2. 删除整个链表

删除某个节点

删除某个节点需要找到这个节点的前一个节点,然后将这个节点的前继节点的 next 指向这个节点的后继节点即可。

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

  // 删除某个节点
  remove(node) {
    let prev = null;
    let cur = this.head;

    while (cur !== node) {
      prev = cur;
      cur = cur.next;
    }

    if (prev) {
      prev.next = cur.next;
    } else {
      this.head = cur.next;
    }
  }
}

删除整个链表

删除整个链表只需要将链表的头节点设为 null 即可。

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

  // 删除整个链表
  clear() {
    this.head = null;
  }
}

遍历

遍历链表可以通过循环遍历每个节点来实现。其中,从链表的头节点开始,每次循环将当前节点的下一个节点作为下一次循环的当前节点,直到循环到链表的末尾。

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

  // 遍历链表
  traverse(fn) {
    let cur = this.head;

    while (cur) {
      fn(cur);
      cur = cur.next;
    }
  }
}

JavaScript 实现数据结构的具体步骤

下面是使用 JavaScript 实现链表数据结构的具体步骤:

  1. 定义一个类来表示链表的节点。
  2. 定义一个类来表示链表,这个类至少需要包含一个指向链表头节点的属性。
  3. 在链表类的方法中实现插入、删除和遍历等操作。

下面是一个完整的链表实现示例:

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

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

  // 在某个节点之后插入一个节点
  insertAfter(targetNode, newNode) {
    newNode.next = targetNode.next;
    targetNode.next = newNode;
  }

  // 在链表的头部插入一个节点
  insertAtHead(newNode) {
    newNode.next = this.head;
    this.head = newNode;
  }

  // 删除某个节点
  remove(node) {
    let prev = null;
    let cur = this.head;

    while (cur !== node) {
      prev = cur;
      cur = cur.next;
    }

    if (prev) {
      prev.next = cur.next;
    } else {
      this.head = cur.next;
    }
  }

  // 删除整个链表
  clear() {
    this.head = null;
  }

  // 遍历链表
  traverse(fn) {
    let cur = this.head;

    while (cur) {
      fn(cur);
      cur = cur.next;
    }
  }
}

示例说明

下面给出两个示例说明链表的使用。

示例 1:在某个节点之后插入一个节点

const list = new LinkedList();

list.insertAtHead(new Node(3));
list.insertAtHead(new Node(2));
list.insertAtHead(new Node(1));

console.log('before insert:');
list.traverse(node => console.log(node.data)); // 1 2 3

const targetNode = list.head.next;
const newNode = new Node(4);
list.insertAfter(targetNode, newNode);

console.log('after insert:');
list.traverse(node => console.log(node.data)); // 1 2 3 4

上面的示例创建了一个链表,并在链表的头部插入了三个节点。然后找到链表的第二个节点,并在它之后插入了一个新节点。最后输出插入后的链表内容。

示例 2:删除某个节点

const list = new LinkedList();

list.insertAtHead(new Node(3));
list.insertAtHead(new Node(2));
list.insertAtHead(new Node(1));

console.log('before remove:');
list.traverse(node => console.log(node.data)); // 1 2 3

const targetNode = list.head.next;
list.remove(targetNode);

console.log('after remove:');
list.traverse(node => console.log(node.data)); // 1 3

上面的示例创建了一个链表,并在链表的头部插入了三个节点。然后找到链表的第二个节点,并删除它。最后输出删除后的链表内容。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:使用JavaScript实现链表的数据结构的代码 - Python技术站

(0)
上一篇 2023年5月17日
下一篇 2023年5月17日

相关文章

  • C语言数据结构哈希表详解

    C语言数据结构哈希表详解 什么是哈希表? 哈希表(Hash Table)是一种采用散列函数(hash函数)将数据映射到一个固定长度的数组中,并且以 O(1) 的时间复杂度进行数据插入、查找、删除操作的数据结构。哈希表主要由以下三个组成部分构成:- 数组:用于存储映射到对应下标上的数据。- 散列函数:将数据映射到数组下标上的规则。- 冲突处理方式:当不同的数据…

    数据结构 2023年5月16日
    00
  • java实现数据结构单链表示例(java单链表)

    下面是 Java 实现数据结构单链表的完整攻略。 简介 单链表是数据结构中的一种,用于存储一组有序的元素。单链表中,每个元素都由一个结点表示,结点中包含了一个指向下一个结点的指针。单链表的结构更加灵活,支持插入、删除等操作。 实现步骤 1. 定义节点类ListNode 单链表的每一个节点包含两个属性,分别是节点值 val 和指向下一个节点的指针 next,所…

    数据结构 2023年5月17日
    00
  • Java数据结构之堆(优先队列)的实现

    Java 数据结构之堆(优先队列)的实现 什么是堆(优先队列) 堆(Heap)是一种数据结构,使用数组实现。堆分为小根堆和大根堆,大根堆满足父节点值大于子节点,小根堆则相反。堆通常被用来实现优先队列(Priority Queue)。 优先队列(Priority Queue)是一个能够让用户迅速查找到队列中最小值(或最大值)的抽象数据类型(ADT)。优先队列通…

    数据结构 2023年5月17日
    00
  • Java面试题冲刺第十九天–数据库(4)

    本篇攻略是针对Java数据库相关面试题的,为了方便浏览,我将其分为以下几个部分: 1. 数据库连接池 在Java开发中,我们使用JDBC连接数据库进行数据操作时,为了提高数据库访问性能,通常会使用数据库连接池技术。常见的数据库连接池有:C3P0、Druid、HikariCP等。 C3P0 C3P0是一个开源的数据库连接池,可以设置最大连接数、最小连接数、最大…

    数据结构 2023年5月17日
    00
  • 题目 3158: 蓝桥杯2023年第十四届省赛真题-三国游戏(贪心)

    题目描述 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y, Z 增加Ai , Bi ,Ci 。当游戏结束时 (所有事件的发生与否已经确定),如果 X, Y, Z 的其中一个大于另外两个之…

    算法与数据结构 2023年4月30日
    00
  • Go语言数据结构之希尔排序示例详解

    Go语言数据结构之希尔排序示例详解 希尔排序简介 希尔排序,也称为缩小增量排序,是插入排序的一种更高效的改进版本;希尔排序是非稳定排序算法。 希尔排序的基本思想是已距离进行“减半”的插入排序;先将整个待排序的记录序列分割成若干个子序列,分别进行直接插入排序,待各子序列中的记录基本有序时,再将子序列合并为整体有序序列。 希尔排序的过程 从上面的简介中我们可以得…

    数据结构 2023年5月17日
    00
  • [Week 18] 每日一题(C++,动态规划,线段树,数学)

    目录 [Daimayuan] T1 最长公共子序列(C++,DP,二分) 输入格式 输出格式 数据范围 输入样例 输出样例 解题思路 [Daimayuan] T2 喵喵序列(C++,序偶) 题目描述 输入格式 输出格式 样例输入 样例输出 样例说明 数据范围 双倍经验 解题思路: [Daimayuan] T3 漂亮数(C++,字符串) 输入描述 输出描述 输…

    算法与数据结构 2023年4月25日
    00
  • C语言数据结构 链表与归并排序实例详解

    C语言数据结构 链表与归并排序实例详解 链表介绍 链表是一种数据结构,它对于存储数据是动态而灵活的。它可以根据我们的需要动态的分配内存空间。链表是由先后相连的数据单元(结点)组成,每个结点都包含了下一结点的地址信息,最后一个结点的地址信息为NULL。链表按照操作方式可以分为单向链表、双向链表与循环链表等几种类型。 归并排序原理 归并排序是一种分治思想的算法,…

    数据结构 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部