0

0

javascript中有链表吗

WBOY

WBOY

发布时间:2022-06-15 16:05:51

|

1826人浏览过

|

来源于php中文网

原创

JavaScript中没有链表;链表是指多个元素组成的列表,元素存储不连续而是用next指针连接在一起,因此链表增删非首尾元素时不需要移动元素,只需要更改next的指向即可,在JavaScript中可以利用Object来模拟链表。

javascript中有链表吗

本教程操作环境:windows10系统、javascript1.8.5版、Dell G3电脑。

javascript中有链表吗

javascript中没有链表

什么是链表?

04.png

链表是多个元素组成的列表

立即学习Java免费学习笔记(深入)”;

元素存储不连续,用next指针连接到一起

JS中没有链表,但是可以用Object模拟链表

常用操作

新增节点 append

删除节点 remove

插入节点 insert

获取索引 indexOf

LOVESTUdio多校园网络店铺
LOVESTUdio多校园网络店铺

主要更新介绍: 完美整合Discuz!论坛,实现一站式登陆、退出、注册; 同步所有会员资料; 新增购物车功能,商品购买更加方便、快捷; 新增部分快捷菜单,网站访问更加方便; 限制首页商品、店铺标题显示长度; 修正会员后台管理不能更改密码的错误; 完善商品显示页面所有功能链接; 修正后台标签管理部分错误; 修正前台学校列表不按后台顺序显示的错误; 修正搜索功能中学校名称过长导致显示紊乱的现象; 修正

下载

链表转字符串 toString

获取链表长度 size

判断链表是否为空 isEmpty

数组 VS 链表

数组: 增删非首尾元素时往往需要移动元素

链表:增删非首尾元素,不许要移动元素,只需要更改next的指向即可。

示例如下:

JavaScript没有直接的链表实现,以下是自己对链表的简单实现

function LinkedList(){
    var Node = function(element){
        this.element = element;
        this.next = null;
    }
    var head = null;
    var length = 0;
    // 定义append方法
    this.append = function(element){
        var node = new Node(element),
        current;
        // 当head为空时,就将新增的node作为head
        if(head === null){
            head = node
        }else{
            // 当head不为空时,将head赋值为当前值,通过判断当前值的next值是否存在遍历整个链表
            current = head;
            while(current.next){
                current = current.next;
            }
            // 遍历到链表的最后一项时,设置最后一项的next为新增的内容
            current.next = node
        }
        // 每新增一项,length都加1操作
        length++;
    }
    // 定义toString方法
    this.toString = function(){
        var string = '',
        current = head;
        // 最初将当前值定位到头部,当current存在时,将current的值添加到需要返回的string中,之后将current取为链表下一个值
        while(current){
            string += current.element + ( current.next ? ',' : '');
            current = current.next
        }
        // 遍历完整个链表之后返回string
        return string;
    }
    this.removeAt = function(position){
        // 当指定的位置没有在链表的长度范围内时直接返回null
        if(position > -1 && position < length){
            var current = head,
            index = 0,
            previous;
            // 指定为值是第一个时就将head移到下一个位置
            if(position === 0){
                head = current.next
            }else{
                // 通过遍历的方式将current移动到指定位置,使用index记录移动的距离
                while(index < position){
                    previous = current;
                    current = current.next;
                    index++;
                }
                // 删除是通过将指定位置的上一个节点的next指向指定位置的下一个节点
                previous.next = current.next
            }
            // 一旦删除成功需要将长度减一并返回删除的值
            length--;
            return current.element;
        }
        return null;
    }
    // 实现插入功能
    this.insert = function(position,element){
        // 插入的位置不在链表范围内时返回false
        if(position > -1 && position <= length){
            var current = head,
            index = 0,
            node = new Node(element),
            previous;
            // 插入内容在头部时将插入的node的next指定为current,current此时为head,然后将head指定为插入的node
            if(position === 0){
                node.next = current;
                head = node;
            }else{
                // 通过遍历的方式将指针指定到插入的位置,index记录当前移动的位置
                while(index < position){
                    previous = current;
                    current = current.next
                    index++
                }
                // 插入元素通过将插入位置的上一个元素的next指向插入的节点,并将插入的节点的next指向当前节点
                previous.next = node;
                node.next = current;
            }
            // 插入成功之后length加1
            length++;
            return true;
        }
        return false
    }
    // 实现查找指定element的index的功能
    this.indexOf = function(element){
        var index = 0,
        current = head;
        // 通过遍历的方式寻找指定元素所在的位置.
        // 当前节点存在时,判断当前节点的element是否为需要寻找的element,如果是就返回此时的index,如果不是就继续向下遍历节点
        // 当存在两个相同内容时只会返回第一个index
        while(current){
            if(current.element === element){
                return index;
            }
            current = current.next;
            index++;
        }
        return -1;
    }
}

实现之后进行如下调用:

var linkedList = new LinkedList();
linkedList.append(15);
linkedList.append(10);
linkedList.insert(1,2) // true
linkedList.insert(2,2) // true
linkedList.toString() // "15,2,2,10"
linkedList.removeAt(3) // 10
linkedList.toString() // "15,2,2"
linkedList.indexOf(2) // 1

【相关推荐:javascript视频教程web前端

相关文章

java速学教程(入门到精通)
java速学教程(入门到精通)

java怎么学习?java怎么入门?java在哪学?java怎么学才快?不用担心,这里为大家提供了java速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

65

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

121

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

33

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

85

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

11

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

47

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

相关下载

更多

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 3.8万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 2.3万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 2.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号