JavaScript数据结构之链表的实现

JavaScript数据结构之链表的实现

什么是链表

链表是一种线性数据结构,其中的元素在内存中不连续地存储,每个元素通常由一个存储元素本身的节点和一个指向下一个元素的引用组成。相比较于数组,链表具有如下优缺点:

  • 优点:动态地添加或删除元素时,无需移动其它元素。(数组则需要移动其它元素)
  • 缺点:不能随机地访问某个元素,必须从头开始顺序遍历。(而数组可以通过索引直接访问任何元素)

链表的基本操作

链表的基本操作包括插入、删除、查找等。下面是对应操作的 JavaScript 实现。

创建链表节点

为了实现链表,首先需要创建一个节点类。

class Node {
  constructor(element) {
    this.element = element; // 当前节点元素
    this.next = null; // 下一个节点连接
  }
}

在链表末尾添加元素

在链表末尾添加元素时,需要先找到最后一个节点,然后将该节点的 next 指向新节点。

class LinkedList {
  constructor() {
    this.length = 0; // 链表长度
    this.head = null; // 头节点
  }
  append(element) {
    let node = new Node(element);
    let current;
    if (this.head == null) { // 链表为空
      this.head = node;
    } else { // 链表不为空,找到最后一个节点,并将其 next 指向新节点
      current = this.head;
      while (current.next) {
        current = current.next;
      }
      current.next = node;
    }
    this.length++;
  }
}

下面是一个在链表末尾添加元素的示例:

let list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
console.log(list); // 链表长度为 3,头节点为 1,尾节点为 3。

在链表指定位置插入元素

在链表中插入元素时,需要找到被插入位置的前一个节点,然后将该节点的 next 指向新节点,新节点的 next 指向原来的节点。

class LinkedList {
  //...
  insert(position,element){
    if(position>=0&&position<=this.length){
      let node=new Node(element);
      let current=this.head,previous,index=0;
      if(position==0){ //插入到头节点
        node.next=current;
        this.head=node;
      }else{
        while(index++<position){ //找到要插入的位置,并找到其前一个节点
          previous=current;
          current=current.next;
        }
        previous.next=node;
        node.next=current;
      }
      this.length++;
      return true;
    }
    return false;
  }
}

下面是一个在链表指定位置插入元素的示例:

let list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
list.insert(1,4);
console.log(list); // 链表长度为 4,头节点为 1,尾节点为 3,第二个节点为 4。

删除链表中指定位置的元素

在删除链表中的元素时,需要找到该节点的前一个节点,然后将前一个节点的 next 指向该节点的下一个节点。

class LinkedList {
  //...
  removeAt(position){
    if(position>=0&&position<this.length){
      let current=this.head,previous,index=0;
      if(position===0){ //删除头节点
        this.head=current.next;
      }else{
        while(index++<position){ //找到要删除的位置,并找到其前一个节点
          previous=current;
          current=current.next;
        }
        previous.next=current.next;
      }
      this.length--;
      return current.element;
    }
    return null;
  }
}

下面是一个在链表中删除指定位置元素的示例:

let list = new LinkedList();
list.append(1);
list.append(2);
list.append(3);
list.removeAt(1);
console.log(list); // 链表长度为 2,头节点为 1,尾节点为 3。

总结

以上就是链表的实现及基本操作的介绍,相信通过以上的示例教程,你已经对链表有了更深层次的理解。需要注意的是,链表虽然能够提高插入和删除元素的效率,但由于无法随机访问任何元素,因此在某些需要快速访问元素的场合并不适用。

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

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

相关文章

  • Java数据结构之优先级队列(堆)图文详解

    Java数据结构之优先级队列(堆)图文详解 什么是优先级队列(堆) 优先级队列(堆)是一种非常重要的数据结构,它能够更好地管理数据,分配任务等。优先级队列的本质就是一种特殊的队列,它是一种可以根据元素的优先级来出队的数据结构。 通常情况下,队列中存储了一系列具有优先级的数据。当我们从队列中取出元素时,优先级高的元素会先出队。因此,我们需要一种数据结构,来对这…

    数据结构 2023年5月17日
    00
  • 手撕HashMap(二)

    这里再补充几个手撕HashMap的方法 1、remove() remove 方法参数值应该是键值对的键的值,当传入键值对的键的时候,remove 方法会删除对应的键值对 需要利用我们自己先前创建的 hashcodeList 来实现,hashcodeList 存入了所有被使用的 hashcode 值,方便后续的操作 在 put() 中,当添加新的键值对时,就会…

    算法与数据结构 2023年4月18日
    00
  • Java数据结构之常见排序算法(上)

    Java数据结构之常见排序算法(上) 本篇文章将介绍常见的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。这些排序算法既是学习算法和数据结构的入门知识,也是在实际工作中常用的基础算法。 冒泡排序 冒泡排序是一种简单的排序算法,它的基本思想是从前往后依次比较相邻的两个元素,如果前面的元素比后面的元素大,则交换它们的位置,重复这个过程,每一轮比较…

    数据结构 2023年5月17日
    00
  • Java数据结构之有向图的拓扑排序详解

    下面我将为您详细讲解“Java数据结构之有向图的拓扑排序详解”的完整攻略。 拓扑排序概述 拓扑排序是一种常见的有向无环图(DAG)的排序方法,该算法将DAG图中所有节点排序成一个线性序列,并且使得所有的依赖关系都满足从前向后的顺序关系。一般来说,DAG图的所有节点可以表示为一个任务依赖关系,而拓扑排序则可以对这些任务进行排序,确保每个任务在它所依赖的任务之后…

    数据结构 2023年5月17日
    00
  • C++中的数组、链表与哈希表

    C++中的数组、链表与哈希表 数组 数组是一种数据结构,它存储的是一组相同类型的值。数组中每个元素的类型都是相同的,而且数组中的元素是按照一定的顺序排列的。C++中的数组是有序的,并且可以通过下标来访问数组中的元素。 数组的定义和初始化 在C++中定义数组的语法如下: type arr_name[arr_size]; 其中,type表示数组元素的类型,arr…

    数据结构 2023年5月17日
    00
  • C++数据结构之AVL树的实现

    C++数据结构之AVL树的实现 什么是AVL树 AVL树是一种自平衡二叉查找树,也就是说它通过旋转操作来保持树的平衡。 在AVL树中,任何节点的两个子树高度差不超过1。如果高度差大于1,则需要通过旋转操作来调整树的平衡。 AVL树提供了比红黑树更快的插入和删除操作,但是在读取数据时红黑树更快。 AVL树的实现 结构体定义 我们可以先定义一个结构体来表示AVL…

    数据结构 2023年5月17日
    00
  • 2021最新Android笔试题总结美团Android岗职能要求

    2021最新Android笔试题总结和美团Android岗职能要求 简介 本文主要介绍了2021最新的Android笔试题总结和美团Android岗职能要求,旨在为正在面试美团Android岗位的面试者提供参考。 笔试题总结 下面是近期美团Android面试中出现的一些笔试题目: 1. 请描述Android中BroadcastReceiver的生命周期。 安…

    数据结构 2023年5月17日
    00
  • C++数据结构之二叉搜索树的实现详解

    C++数据结构之二叉搜索树的实现详解 1. 什么是二叉搜索树? 二叉搜索树是一种二叉树,其中每个节点都包含一个键值,且每个节点的键值都大于其左子树中任何节点的键值,小于其右子树中任何节点的键值。如下图所示: 9 / \ 4 15 / \ 12 20 在上面的二叉搜索树中,节点的键值分别是9, 4, 15, 12, 20,且每个节点的键值都符合上述定义。 2.…

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