JavaScript中怎么实现链表?
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
相关文章:
JavaScript中怎么实现链表?
JavaScript中怎么实现链表? 学习数据结构的的链表和树时,会遇到节点(node)这个词,节点是处理数据结构的链表和树的基础。节点是一种数据元素,包括两个部分:一个是实际需要用到的数据;…...
多孔弹性材料中传播的膨胀波方法(Matlab代码实现)
👨🎓个人主页:研学社的博客💥💥💞💞欢迎来到本博客❤️❤️💥💥🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密…...
时间复杂度与空间复杂度
目录一、算法的复杂度二、时间复杂度2.1 什么叫时间复杂度2.2 大O的渐进表示法2.3 计算时间复杂度的练习三、空间复杂度四、常见复杂度的对比一、算法的复杂度 算法在编写成可执行程序后,运行时需要耗费时间资源和空间(内存)资源 。因此衡量一个算法的好坏…...
UDP报文详解
目录 🐳今日良言:走好选择的路,别选择好走的路,你才能拥有真正的自己。 🐼一、UDP协议特点 🐼二、UDP协议段格式详解 🐳今日良言:走好选择的路,别选择好走的路,你才能拥有真正的自…...
C#开发的OpenRA的NextPowerOf2
C#开发的OpenRA的NextPowerOf2 在游戏里,经常需要对计算资源进行优化。 比如屏幕的大小,以及缓冲区的大小,还有纹理的大小。 由于计算机都是基于二进制的原理,那么它的最快计算速度,就是让计算的数字都是2的n次方。 基于此策略,在程序里就需要计算出来最接近2的n次方的数…...
CDH 6.3.2启用HDFS高可用
启用原因 CDH 6.3.2平台即将用于生产,生产平台几乎需要高可用平台,故需要升级CDH中的HDFS为HA。 启用准备 CDH已经成功安装并正常使用CMS的管理员账号正常登陆 HDFS启用HA 登陆CMS系统->选择HDFS服务->点击进入到HDFS服务详情页面,…...
多服务器节点访问解决一人一单问题+redis设置锁方案
项目地址及项目具体介绍-码云仓库:https://gitee.com/flowers-bloom-is-the-sea/distributeNodeSolvePessimisticLockByRedis 测试1: 这里使用jmeter同时启动2各线程: 原来的数据库表的数据: goods的数据是: id …...
tensorflow 学习笔记(三):神经网络八股
本节内容: 前两节使用 Tensorflow2 的原生代码大叫神经网络。本节使用 keras 搭建神经网络(八股:六步法,有 Sequential 和 class 两种)。 文章目录一、搭建网络八股 sequential1.1、keras 介绍1.2、六步法搭建 keras …...
华为OD机试真题Python实现【射击比赛】真题+解题思路+代码(20222023)
射击比赛 题目 给定一个射击比赛成绩单 包含多个选手若干次射击的成绩分数 请对每个选手按其最高三个分数之和进行降序排名 输出降序排名后的选手 ID 序列 条件如下: 一个选手可以有多个射击成绩的分数 且次序不固定如果一个选手成绩小于三个 则认为选手的所有成绩无效 排名忽…...
【YBT2023寒假Day12 C】树的计数 II(prufer)(结论)(数学)
树的计数 II 题目链接:YBT2023寒假Day12 C 题目大意 给你一个长度为 n 的排列 p,问你有多少个不同的有标号无根树,满足如果 i,j 有边那 pi,pj 也有边。 思路 首先可以把排列变成置换环。 注意到是树,发现一个置换中似乎不太可…...
深入浅出C++ ——多态
文章目录一、多态的概念二、多态的定义及实现1. 多态的构成条件2. 虚函数3. 虚函数的重写4. virtual的使用:5. 虚函数重写的两个例外:6. C11 override 和 final7. 重载、重写、重定义的对比三、抽象类四、多态的原理1. 虚函数表2. 多态的原理3. 静态绑定…...
华为OD机试真题Python实现【整数编码】真题+解题思路+代码(20222023)
整数编码 题目 实现一个整数编码方法 使得待编码的数字越小 编码后所占用的字节数越小 编码规则如下 编码时7位一组,每个字节的低 7 位用于存储待编码数字的补码字节的最高位表示后续是否还有字节,置1表示后面还有更多的字节,置0表示当前字节为最后一个字节采用小端序编码…...
FPGA纯Vhdl实现MIPI CSI2RX视频解码输出,OV13850采集,提供工程源码和技术支持
目录1、前言2、Xilinx官方主推的MIPI解码方案3、纯Vhdl方案解码MIPI4、vivado工程介绍5、上板调试验证6、福利:工程代码的获取1、前言 FPGA图像采集领域目前协议最复杂、技术难度最高的应该就是MIPI协议了,MIPI解码难度之高,令无数英雄竞折腰…...
7 个 JavaScript Web API 来构建你不知道的未来网站
随着技术的日新月异,为开发人员提供了令人难以置信的新工具和API。但据了解,在100 多个 API中,只有5%被开发人员积极使用。让我们来看看一些有用的Web API,它们可以帮助您将网站推向月球!🌕🚀1.…...
跟ChatGPT,聊聊ChatGPT
不仅“上知天文、下知地理”,似乎还能对答如流、出口成诗,甚至还能写剧本、编音乐、写代码——最近,一款名叫ChatGPT的人工智能聊天机器人火爆全球。由此,一系列关于新一代技术变革、人工智能替代人力、巨头企业扎堆入局AI的讨论在…...
Java 数组(详细教学 基础篇)
一、数组的基本要素 标识符:数组的名称数组元素:数组中存放的数据元素下标:对数组元素进行编号,数组下标从0开始来访问元素类型:数组元素的数据类型 二、数组的五种赋值方法和使用方法 声明数组 int[] arr;//开辟三个…...
python装饰器原理 | 常用装饰器使用(@cache, @lru_cache)
🚀 关于python的装饰器原理介绍可看这里,讲的挺简洁易懂:python装饰器原理 ⭐ 弄懂装饰器原理后,来学学常用装饰器。 文章目录1、cache, lru_cache1、cache, lru_cache 也就是一种装饰在被执行的函数上,将其执行的结果…...
[oeasy]python0090_极客起源_wozniac_苹果公司_Jobs_Wozniac
极客起源 回忆上次内容 上次回顾了 DEC公司的兴起 从IBM的大型机 到DEC的小型机Mini Computer 再到DEC的终端 VT-100 计算机基础元器件发生了进化 从ENIAC的 电子管到PDP系列的 晶体管 新的器件 体积小了价格低了稳定性 提高了而且 连成了网络 ARPA网 就是 最初的Internet …...
Spring基础总结(下)
简介 本章节通过手写一个简单的 Spring 框架来加深对 Spring 框架源码以及设计思想的理解; 实现步骤 BeanScope 枚举代码 public enum BeanScope { sigleton, prototype; }AppConfig 配置类 // 定义包扫描路径 ComponentScan("com.dufu.spring"…...
设计模式面试题
设计模式分为 创建型 工厂模式 单例 原型行为性 责任链 迭代器 命令中介型结构性 适配器 代理 门面 装饰器 组合 桥接单例设计模式 懒汉式 用到时再创建,省内存 饿汉式 类创建时就创建,会占用内存 内部类 用到时再创建,省内存 线程池、数据…...
C# + Halcon实战:药盒上多个条形码一次扫全的配置与代码详解(.NET Framework 4.8)
C# Halcon实战:药盒多条形码高精度识别系统开发指南 在药品包装生产线上,一个药盒往往同时印有追溯码、物流码和防伪码等多种条形码。传统扫码设备通常需要多次定位才能完成读取,而基于Halcon的机器视觉方案能实现毫秒级的多码同步识别。本文…...
低成本AI助手方案:OpenClaw+GLM-4.7-Flash替代ChatGPT Plus
低成本AI助手方案:OpenClawGLM-4.7-Flash替代ChatGPT Plus 1. 为什么选择自建AI助手? 去年我开始频繁使用ChatGPT Plus处理日常工作,但每月20美元的订阅费用加上额外API调用,账单经常突破50美元。更让我困扰的是,处理…...
电脑卡顿的幕后真相:为什么你的内存总是不够用?
电脑卡顿的幕后真相:为什么你的内存总是不够用? 【免费下载链接】memreduct Lightweight real-time memory management application to monitor and clean system memory on your computer. 项目地址: https://gitcode.com/gh_mirrors/me/memreduct …...
OpenClaw安全指南:Qwen3-32B-Chat本地化执行边界控制
OpenClaw安全指南:Qwen3-32B-Chat本地化执行边界控制 1. 为什么需要关注OpenClaw的安全边界? 去年冬天的一个深夜,我被一阵急促的键盘敲击声惊醒。走进书房,发现OpenClaw正在自动执行我前一天设置的爬虫任务——这本是正常现象&…...
Open-SaaS:现代化企业级SaaS应用架构的工程实践指南
Open-SaaS:现代化企业级SaaS应用架构的工程实践指南 【免费下载链接】open-saas A free, open-source SaaS app starter for React & Node.js with superpowers. Production-ready. Community-driven. 项目地址: https://gitcode.com/GitHub_Trending/op/open…...
OpenClaw深度沟通渠道-全景深度解构
OpenClaw深度沟通渠道-全景深度解构OpenClaw的渠道(Channels)是其“交互层”的核心,是用户意图与AI执行力的唯一交汇点。选择渠道,就是选择将AI能力注入您数字生活的哪个场景。以下分析将超越简单列表,深入每个渠道的技…...
FlyEnv-安装使用摸索记录
下载 官网地址:https://www.macphpstudy.com/zh/ 进入github下载,也可以百度网盘下载。 下载完后进行安装,我是选择为当前用户安装,没有为所有用户安装。 进入页面进行需要安装的软件;看上去还是有蛮多的,…...
别再只会用Burpsuite了!手把手教你用Python脚本+Crunch字典搞定DVWA暴力破解
从零构建Python自动化爆破工具:DVWA全等级攻防实战解析 在渗透测试领域,暴力破解(Brute Force)始终是验证系统弱口令防御的基础手段。虽然Burpsuite这类图形化工具降低了入门门槛,但真正理解底层通信原理并构建自定义攻击脚本,才是…...
AI Toolkit for Visual Studio Code完全指南:从环境配置到应用部署的AI开发工具链实践
AI Toolkit for Visual Studio Code完全指南:从环境配置到应用部署的AI开发工具链实践 【免费下载链接】vscode-ai-toolkit 项目地址: https://gitcode.com/GitHub_Trending/vs/vscode-ai-toolkit 工具认知篇:重新定义AI开发流程 AI开发工具链正…...
揭秘新篇!AI应用架构师的数据安全服务AI防护新思路
揭秘新篇!AI应用架构师的数据安全服务AI防护新思路 一、引言:AI时代的数据安全困局 当我们谈论AI应用时,数据是一切的核心——它是模型训练的“燃料”,是推理决策的“依据”,更是企业的核心资产。但随着AI技术的普及&a…...
