JavaScript中怎么实现链表?

news2025/7/18 3:24:14

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.head
        while(currNode.next){   //若当前节点的next域为空,则他是链表的最后一个节点,跳出循环
            currNode = currNode.next  //若当前节点的next域不为空则让指针指向当前节点的下一个节点
        }
        return currNode
    }
 
    //采用尾插法给链表插入元素
    appendNode(element){
        var currNode = this.findLast()  //找到链表的最后一个节点
        var newNode = new Node(element)  //创建一个新的节点
        currNode.next = newNode
        newNode.next = null
        this.size++   //链表的长度加1
    }
 
    //删除链表中的一个节点
    delete(element){
        //this.displayList()
        var currentNode = this.head
        try{
            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())  //打印链表是否为空,若为空则输出true
        slist.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.coloradmin.cn/o/362639.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MATLAB | 如何用MATLAB绘制这样有气泡感的网络图

今天给大家带来一款用来绘制有气泡感的网络图的工具函数&#xff0c;绘制效果如下&#xff1a; 花里胡哨的&#xff0c;气泡大小代表流入流出数据量综合&#xff0c;不同颜色的气泡代表属于不同类&#xff0c;两个气泡之间有连线代表有数据流动&#xff0c;连线透明度代表流动数…

木鱼cms 审计小结

MuYuCMS基于Thinkphp开发的一套轻量级开源内容管理系统,专注为公司企业、个人站长提供快速建站提供解决方案。‍环境搭建我们利用 phpstudy 来搭建环境&#xff0c;选择 Apache2.4.39 MySQL5.7.26 php5.6.9 &#xff0c;同时利用 PhpStorm 来实现对项目的调试‍漏洞复现分析‍…

经过深思熟虑后的接口测试自动化的总结与思考

序近期看到阿里云性能测试 PTS 接口测试开启免费公测&#xff0c;本着以和大家交流如何实现高效的接口测试为出发点&#xff0c;本文包含了我在接口测试领域的一些方法和心得&#xff0c;希望大家一起讨论和分享&#xff0c;内容包括但不仅限于&#xff1a;服务端接口测试介绍接…

中央一号文件首提“即时零售”,县域掀起消费业态新风潮

经过几年的探索&#xff0c;即时零售已经逐步走向成熟&#xff0c;并开始向三四线城市以及乡镇城市渗透。 过去一年&#xff0c;京东、美团、阿里争先布局即时零售市场&#xff0c;完善即时配送网络、培养用户消费习惯&#xff0c;即时零售订单迎来了骤增。2022年下半年&#…

【字节面试】Fail-fast知识点相关知识点

字节面试&#xff0c;问到的一个小知识点&#xff0c;这里做一下总结&#xff0c;其实小编之前有一篇文章&#xff0c;已经对此有过涉及&#xff0c;不过这里知识专项针对于问题&#xff0c;把这个知识点拎出来说一下。 1.问题 什么是Fail-fast机制&#xff1f; Hashmap是否拥…

斯坦福大学团队提出AI生成文本检测器DetectGPT,通过文本对数概率的曲率进行可解释判断

原文链接&#xff1a;https://www.techbeat.net/article-info?id4583 作者&#xff1a;seven_ 随着以ChatGPT等大型语言模型&#xff08;large language models&#xff0c;LLMs&#xff09;的爆火&#xff0c;学界和工业界目前已经开始重视这些模型的安全性&#xff0c;由于C…

DSP28系列 CCS 开发问题总结及解决办法

文章目录 问题汇总 1. CCS编译器的Project菜单栏工程导入选项丢失&#xff0c;怎么解决&#xff01; 1.1启动CCS后发现导入工程菜单栏丢失&#xff0c;无法导入工程文件。 1.2方法一 工程选项的导入工程文件丢失&#xff0c;如果要重新获得相应的选项&#xff0c;就需要删除当前…

Java必备小知识点2——输入输出与变量

变量变量的实质假如将内存比喻成一座房子&#xff0c;存入内存就相当于住进房子。但是如果一个房间给了应人&#xff0c;他却不住&#xff0c;那么房间实际上是空着的&#xff0c;又属于个人&#xff0c;别人无法住进来&#xff0c;就会造成浪费。那么将内存比喻成酒店&#xf…

Cocoa-autoLayout

什么是autoLayout autoLayout的重新布局是通过 constraints 各个view实现自动布局&#xff0c;autoLayout重新调整布局view是在runtime中 autolayout without constraints 也就是通过stack view实现不引入复杂的constraints的情况下 还能使用autoLayout 什么是stack view …

SPDK NVMe-oF Target

SPDK NVMe-oF TargetNVMe协议制定了本机高速访问PCIe SSD的规范&#xff0c;相对于SATA、SAS、AHCI等协议&#xff0c;NVMe协议在带宽、延迟、IOps等方面占据了极大的优势&#xff0c;但是在价格上目前相对来讲还是比较贵的。不过不可否认的是&#xff0c;配置PCIe SSD的服务器…

软件供应链受威胁下的应对方法——供应链安全管理平台的五大工具能力

背景如今&#xff0c;软件供应链安全问题已经成为一个全球性的难题。根据数据统计&#xff0c;2017年全球遭受网络攻击的公司比例已经达到了93&#xff05;&#xff0c;其中很大一部分是由于软件供应链安全问题导致的。而在中国&#xff0c;据统计&#xff0c;2019年全国共发生…

FlinkSQL行级权限解决方案及源码

FlinkSQL的行级权限解决方案及源码&#xff0c;支持面向用户级别的行级数据访问控制&#xff0c;即特定用户只能访问授权过的行&#xff0c;隐藏未授权的行数据。此方案是实时领域Flink的解决方案&#xff0c;类似离线数仓Hive中Ranger Row-level Filter方案。 源码地址: https…

不可变集合、Stream、异常、日志框架

创建不可变集合 什么是不可变集合&#xff1f;不可变集合&#xff0c;就是不可被修改的集合。集合的数据项在创建的时候提供&#xff0c;并且在整个生命周期中都不可改变。否则报错。为什么要创建不可变集合&#xff1f;如果某个数据不能被修改&#xff0c;把它防御性地拷贝到…

交叉编译 SQLite

交叉编译 SQLite 概述 SQLite 是一个 C 语言库&#xff0c;它实现了一个小型、快速、自包含、高可靠性、功能齐全的 SQL 数据库引擎。SQLite 是世界上使用最多的数据库引擎。SQLite 内置于所有手机和大多数计算机中&#xff0c;并捆绑在人们每天使用的无数其他应用程序中。 S…

java迷宫回溯找最短路径问题(多策略)

1、首先我们先明确迷宫&#xff0c;并创建如上图&#xff0c;1为墙&#xff0c;中间的1为挡板墙&#xff0c;由图我们可以看出这是一个二维数组/*** 创建地图* return*/public static int [][] createMap(){int [][] mapNew new int[8][7];//1表示墙&#xff0c;不能走for (in…

Kaggle系列之识别狗的品种类别(深度残差网络模型ResNet-34)

我们来到这个比赛页面&#xff1a;https://www.kaggle.com/competitions/dog-breed-identification这个数据集的目标是Determine the breed of a dog in an image(确定图像中狗的品种)我们先下载数据集解压之后来看下(当然不手动解压&#xff0c;也可以使用)&#xff0c;这里我…

超全 Vue3新特性总结

Vue3 应用-技术分享与交流 新特性篇 Vue3 组合式 API VS Vue2 选项式 API 选项式 API 面临的问题: 我们在处理业务逻辑时&#xff0c;需要在 data computed method watch 中分别进行代码编写&#xff0c;碎片化使得理解和维护复杂组件变得困难。选项的分离掩盖了潜在的逻辑问…

百度工程师浅谈分布式日志

作者 | 文库基础架构 导读 我们做软件开发时&#xff0c;或多或少的会记录日志。由于日志不是系统的核心功能&#xff0c;常常被忽视&#xff0c;定位问题的时候才想起它。本文由浅入深的探讨不起眼的日志是否重要&#xff0c;以及分布式架构下的日志运维工具应该具备哪些能力&…

【单目标优化算法】海鸥优化算法(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

如何使用ODX描述诊断会话和安全等级

ODX 2.2是由ASAM&#xff08;自动化及测量系统标准协会&#xff09;提出的诊断标准&#xff0c;是一种基于XML语言的开放式诊断数据格式&#xff0c;已在国际上得到广泛使用。目前ODX诊断标准也已被国内各大OEM采用&#xff0c;但在ODX数据开发阶段&#xff0c;ODX诊断数据库的…