JavaScript中怎么实现链表?

news/2024/4/19 8:06:04/文章来源:https://blog.csdn.net/cnds123/article/details/129125024

JavaScript中怎么实现链表?

学习数据结构的的链表和树时,会遇到节点(node)这个词,节点是处理数据结构的链表和树的基础。节点是一种数据元素,包括两个部分:一个是实际需要用到的数据;另一个存储下一个节点位置。

链表是一系列节点串联形成的数据结构,链表存储有序的元素集合,链表中的元素在内存中并不是连续放置的。每个元素由一个存储元素本身的部分和一个指向下一个元素的链接部分组成。因此链表增删非首尾元素时不需要移动元素,只需要更改链接部分的值即可。

在此仅看单链表,单链表每个节点的结构如下:

单链表,在这种类型的数据结构中,任何两个数据元素之间只有一个链接,参见下图:

链表的操作包括了创建、删除、插入、输出等。

创建就是空间的分配,将头、尾指针及链表结点个数等初始化。删除和插入根据被操作元素的位置可以细分为头删除(插入),尾删除(插入),中间删除(插入)。

插入操作

头插入实际上是增加一个新节点,然后把新增加的结点指针指向原来头指针指向的元素,再把头指针指向新增的节点。

尾插入也是增加一个新节点,该节点指针置为null,然后把原尾结点指针指向新增加的节点,最后把尾指针指向新增加的节点即可。

中间插入稍复杂,首先增加一个节点,然后新增节点的指针指向插入位置的后一个节点,把插入位置的前一个节点指针指向新插入节点即可。

删除操作

删除头元素时,先将头指针指向下一个节点,然后把原头结点的指针置空即可。

删除尾元素时,首先找到链表倒数第2个元素,然后把尾指针指向这个元素,接着把原倒数第2个元素的指针置空。

删除中间元素相对复杂一些,首先将要删除的节点的前一个节点指针指向要删除的节点的下一个节点,然后把要删除节点的指针置空。

上面提到是单链表最基本的操作,除此之外还有其它操作不多说了。下面给出代码示例。

在 JavaScript中,我们怎么实现链表呢?

现在以单链表的建立和遍历为例介绍。项目结构如下

SingleLinkedList.js文件内容如下:

//定义单向链表的节点类
class Node{constructor(data){this.data = data    //节点的数据部分this.next = null    //节点的链接部分(指针部分)   }
}
//定义单向链表类
class SingleLinked{  constructor(){this.size = 0  //单链表的长度,用来记录链表中的节点个数,为一个空链表this.head = new Node('head')  //是链表的头指针:记录链表的起始地址this.currentNode = ''  //用来记录当前节点}//获取链表的长度getLength(){return this.size}//判断链表是否为空isEmpty(){return this.size === 0   //如果this.size为0则说明链表为空,即返回true}//遍历链表:不重复的访问链表中的每一个节点displayList(){var list = ''var currentNode = this.head  //指向链表的头指针while(currentNode){  //若当前节点不为空,则执行循环list+=currentNode.data    //连接节点的数据域currentNode = currentNode.next  //让当前指针指向当前节点的下一个节点if(currentNode){   //如果currentNode不为空则加上连接符list += '->'  //链表节点的连接符}}console.log(list)}//获取链表的最后一个节点findLast(){var currNode = this.headwhile(currNode.next){   //若当前节点的next域为空,则他是链表的最后一个节点,跳出循环currNode = currNode.next  //若当前节点的next域不为空则让指针指向当前节点的下一个节点}return currNode}//采用尾插法给链表插入元素appendNode(element){var currNode = this.findLast()  //找到链表的最后一个节点var newNode = new Node(element)  //创建一个新的节点currNode.next = newNodenewNode.next = nullthis.size++   //链表的长度加1}//删除链表中的一个节点delete(element){//this.displayList()var currentNode = this.headtry{while((currentNode.next!=null)&&(currentNode.next.element!=element)){  //判断,如果节点靠后则节点的next的next为空,不为空时进行删除if(currentNode.next.data === element){currentNode.next = currentNode.next.next    this.size--}else{currentNode = currentNode.next}}}catch(e){   //测试函数,判断函数的运行错误console.log(e)}}
}

测试代码内容如下,我这里保存文件名为 单链表测试.html,将此文件和SingleLinkedList.js放到同一目录中:

<script src="./SingleLinkedList.js"></script><script>  //不能写在有js代码的JavaScript中var slist = new SingleLinked()console.log(slist.isEmpty())  //打印链表是否为空,若为空则输出trueslist.appendNode(1001)   //创建链表节点slist.appendNode(1002)   //创建链表节点//创建链表更多节点var arr = [1020,1234,1006,788,5512]for(var i=0;i<arr.length;i++){slist.appendNode(arr[i])}//遍历输出链表slist.displayList()//删除链表中的1006元素slist.delete(1006)slist.displayList()
</script>

用浏览器打开 单链表测试.html,按下F12键单开控制台,查看结果:

更多情况可见https://segmentfault.com/a/1190000017970029

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_71881.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

十一、项目实战一

项目实战一 需求 以 前后端不分离的方式实现学生的增删改查操作 学生列表功能 接口设计 url:/students/ 请求方法&#xff1a;get 参数&#xff1a; 格式&#xff1a;查询参数 参数名类型是否必传说明pageint否页码&#xff0c;默认为1sizeinit否每页数据条数默认为10n…

Ansys Zemax | 如何在存在全内反射 (TIR) 的情况下应用散射

在本文中&#xff0c;我们将展示如何利用虚拟表面来对具有全内反射 (TIR) 的物体进行建模&#xff0c;同时保持其他独特的表面特性&#xff0c;例如粗糙的表面结构。 下载 联系工作人员获取附件 简介 在OpticStudio中&#xff0c;全内反射 (TIR) 在其他表面属性&#xff08…

Java:顶级Java应用程序服务器 — Tomcat、Jetty、GlassFish、WildFly

如果你想编写Java web应用程序&#xff0c;首先需要做出一个艰难的决定&#xff1a;选择运行应用程序的Java应用程序服务器。什么是应用服务器?一般来说&#xff0c;应用程序服务器执行Java应用程序。在操作系统中启动它们&#xff0c;然后将应用程序部署到其中。将应用程序服…

07 二叉树

开始系统学习算法啦&#xff01;为后面力扣和 蓝桥杯的刷题做准备&#xff01;这个专栏将记录自己学习算法是的笔记&#xff0c;包括 概念&#xff0c; 算法运行过程&#xff0c;以及 代码实现&#xff0c;希望能给大家带来帮助&#xff0c;感兴趣的小伙伴欢迎评论区留言或者私…

重要节点排序方法

文章目录研究背景提前约定基于节点近邻的排序方法度中心性&#xff08;degree centrality, DC&#xff09;半局部中心性&#xff08;semilocal centrality, SLC&#xff09;k-壳分解法基于路径排序的方法离心中心性 (Eccentricity, ECC)接近中心性 (closeness centrality, CC)K…

【图文详解】Unity存储游戏数据的几种方法

Unity3D存储游戏数据的方式1 PlayerPrefs: Unity自带的一种简单的键值存储系统2 ScriptableObject: Unity中最灵活的数据管理工具2.1 如何手动创建和修改数据文件2.2 ScriptableObject优缺点总结3 JSON: 轻量级的数据交换格式3.1 序列化与反序列化3.2 用JsonUtility对对象进行序…

最好的工程师像投资者一样思考,而不是建设者

我在大学期间住在图书馆。“我学习的教科书理论越多&#xff0c;我就会成为一名更好的工程师&#xff0c;”我想。然而&#xff0c;当我开始工作时&#xff0c;我注意到业内最优秀的工程师并不一定比应届毕业生了解更多的理论。他们只是带来了不同的心态&#xff0c;即投资者的…

STM32单片机蓝牙APP空气净化系统甲醛二氧化碳温度SGP30

实践制作DIY- GC0124-蓝牙APP空气净化系统 一、功能说明&#xff1a; 基于STM32单片机设计-蓝牙APP空气净化系统 功能介绍&#xff1a; 硬件组成&#xff1a;STM32F103C最小系统板DS18B20温度传感器OLEDSGP二氧化碳甲醛传感器5V直流风扇多个按键HC-05蓝牙模块&#xff08;仅蓝…

大数据框架之Hadoop:MapReduce(三)MapReduce框架原理——MapReduce工作流程

1、流程示意图 MapReduce详细工作流程&#xff08;一&#xff09; MapReduce详细工作流程&#xff08;二&#xff09; 2、流程详解 上面的流程是整个MapReduce最全工作流程&#xff0c;但是Shuffle过程只是从第7步开始到第16步结束&#xff0c;具体Shuffle过程详解&#xff0…

二进制部署K8S

目录 一、环境准备 1、常见的k8s部署方式 2、关闭防火墙 3、关闭selinux 4、关闭swap 5、根据规划设置主机名 6、在master添加hosts 7、将桥接的IPv4流量传递到iptables的链 8、时间同步 二、部署etcd集群 1、master节点部署 2、查看证书的信息 2.1 创建k8s工作目…

SQL74 纠错2

描述供应商表Vendors有字段供应商名称vend_name、供应商国家vend_country、供应商省份vend_statevend_namevend_countryvend_stateappleUSACAvivoCNAshenzhenhuaweiCNAxian【问题】修改正确下面sql&#xff0c;使之正确返回SELECT vend_name FROM Vendors ORDER BY vend_name W…

【Redis】数据结构篇

一. String 字符串 常见用途&#xff1a;缓存用户信息&#xff0c;将用户信息结构体使用 JSON 序列化为字符串&#xff0c;然后将序列化后的字符串给 Redis 来缓存 Redis 字符串是动态字符串&#xff0c;是可以修改的字符串 —— 实现类似 ArrayList &#xff1f;&#xff1f…

【自动化测试】自动化测试框架那些事儿

无论是在自动化测试实践&#xff0c;还是日常交流中&#xff0c;经常听到一个词&#xff1a;框架。在教学的过程中&#xff0c;同学们一直对“框架”这个词知其然不知其所以然。 最近看了很多自动化相关的资料&#xff0c;加上一些实践&#xff0c;算是对“框架”有了一些理解…

什么是生命周期?Activity生命周期的三种状态

什么是生命周期生命周期就是一个对象从创建到销毁的过程&#xff0c;每一个对象都有自己的生命周期。同样&#xff0c;Activity也具有相应的生命周期&#xff0c;Activity的生命周期中分为三种状态&#xff0c;分别是运行状态、暂停状态和停止状态。接下来将针对Activity生命周…

CANopen概念总结、心得体会

NMT网络管理报文&#xff1a; NMT 主机和 NMT 从机之间通讯的报文就称为 NMT 网络管理报文。常见报文说明&#xff1a; 0101---------------网络报文发送Nmt_Start_Node&#xff0c;让电机进入OP模式(此时还不会发送同步信号) setState(d, Operational)------------------开启…

STM32 SystemInit()函数学习总结

拿到程序后如何看系统时钟&#xff1f;User文件夹——system_stm32f4xx程序&#xff0c;先找systemcoreclock(系统时钟&#xff09;但是这里这么多个系统时钟应该如何选择?点击魔法棒&#xff0c;然后点击C/C可以看到define的是F40_41XXX.USE这一款 &#xff0c;对应着就找出了…

虹科新品 | 最高80W!用于大基板紫外曝光系统的高功率UVLED光源

光刻曝光是指利用紫外光源将胶片或其他透明物体上的图像信息转移到涂有光敏材料&#xff08;光刻胶&#xff09;表面以得到高精度和极细微图案的一种制作工艺&#xff0c;主要用于半导体生产、高精密集成电路、PCB板制造、MEMS等行业。光刻技术是半导体工业和集成电路是最为核心…

SAP FICO 理解业务范围的概念

业务范围 以前转载过几篇关于业务范围的文章&#xff1a; SAP Business Area 业务范围_SAP剑客的博客-CSDN博客_sap 业务范围 SAP FI 系列 002&#xff1a;业务范围派生_stone0823的博客-CSDN博客_sap 业务范围 http://blog.sina.com.cn/s/blog_3f2c03e30102w9yz.html 仍是…

修改redis的配置文件使得windows的图形界面客户端可以连接redis服务器

一、redis自带的客户端&#xff08;了解&#xff0c;不方便&#xff09;进入到redis安装目录的bin目录下指定主机和端口# ./redis-cli -h 127.0.0.1 -p 6379127.0.0.1:6379> exit 【退出】-h&#xff1a;redis服务器的ip地址-p&#xff1a;redis实例的端口号如果不指定主机和…

Dropout

目录一、Dropout出现的原因二、什么是Dropout&#xff1f;三、为什么Dropout解决过拟合?3.1 取平均的作用3.2 减少神经元间复杂的共适应关系四、实现Dropout—— pytorchexample 1example 2example 3设置dropout参数技巧一、Dropout出现的原因 在机器学习的模型中 如果模型的…