使用的编辑器

如果不想每次写个JS的程序都需要嵌入到html中或者拷贝到浏览的console中运行的话,就下载一个编辑器吧,本人使用的是微软的Visual Studio Code,并且强烈推荐这款软件。然后再下载一个node.js,这样就能脱离浏览器,愉快的玩耍JS语言了。

写好代码后,依次点击1和2就能看到代码运行的效果啦!

JS中的数组

在很多其他的编程语言中,使用数组时长度都是固定的,当达到数组的最大长度以后再想向其中添加数据是非常麻烦的,且使用数组的时候添加和删除元素和变得非常的困难。

但是这些问题在JS的数组中并不存在,因为JS数组没有固定的长度,想要往数组中再次添加元素只需要使用push()方法,例如要向数组名arr中添加x元素只需要:

arr

而在数组中删除元素也比其他语言要方便的多,可以使用数组提供的splice()方法,例如要在数组arr中删除元素x,只需要:

let 

JS中的数组异常灵活,数组arr搭配push()和pop()方法就可以变成一个堆栈,其中push()方法在数组的尾端添加一个元素,pop()方法在数组的尾端取出一个元素。搭配push()和shift()方法就可以变成一个队列,其中push()方法在数组的尾端添加一个元素,shift()方法在数组的首段取出一个元素。数组甚至还有unshift()方法,其作用是在数组的首段添加一个元素。

既然JS的数组有那么多的优点那为什么还需要链表这个数据结构呢?

JS中的数组主要的问题是被实现成了对象,和其他语言的数组相比效率很低。链表除了不能随机访问之外,几乎可以用在任何可以使用一位数组的情况中。

链表的实现

链表中的节点类型描述如下:

class 

当然,JS中并没有讨人厌的指针,节点的指针只是借用的C语言中的概念。之所以用prev和next两个指针域是为了实现双向链表,在实现单链表时,prev指针并没有用到。

单链表

首先是单链表,对单链表的操作有:

find

只要实现上述的这些方法,一个基本的单链表结构就实现了。

将这些方法放在单链表的类中,就形成了单链表数据结构的大概框架了。

class 

可以看到该单链表是使用带有表头节点的形式来实现的。

下面对稍微复杂的方法进行实现,其他的方法可以参考单链表的全部实现代码,该代码会在其后贴出。

// 在单链表中寻找item元素

只要当前节点的next指针不为空就一直向下遍历,直到当前节点的next为空时即是最后一个节点了。

findLast

注意advance()函数中的currNode参数使用了默认的this.head。当向前移动的位数超过单链表的长度时,总是返回单链表的最后一个节点。

// 从当前位置向前移动 n 个节点。

在尾部添加元素时使用到了findLast()方法,findLast()方法返回单链表的最后一个元素,因此在单链表的尾部添加元素时,只要将新元素赋值给单链表的最后一个元素的next指针即可。

// 在尾部添加元素

向单链表插入数据时,insert()方法有两个参数,element作为新的节点的数据,item则是单链表中已经存在的节点值,要插入的新节点的位置位于item之后,此时要插入节点的位置分为两种情况:

1、要插入的位置处于单链表的中间位置,此时将新的节点的next指针指向item的下一个元素,再将item的next指针指向新的元素即可。

2、要插入的位置处于单链表的尾部,此时只要将新的节点插入在最后一个节点之后即可。

仔细思考后发现,第二种情况是包含在第一中情况之内的,这是因为当item是单链表中最后一个元素时,其next指针指向为空,将其赋值给newNode的next指针并没有什么问题,因为在新建newNode时,其next指针本身就是空的。因此代码可以写成:

// 向单链表中插入元素

在单链表中删除一个元素时,分为几种情况:

1、要删除head节点。单链表的head节点在一般情况下是不需要去删除的,为了应对删除头结点的情况需要考虑在删除时如果链表的长度不为0时,应该直接返回。因为这个时候如果删除了头结点单链表就找不到入口了。如果在删除时单链表的长度为0,那么直接将头结点的next指针置空即可。

2、要删除的节点不存在。这种情况直接返回。

3、除上面的两种情况外,此时在删除时,先找到item元素,注意当找到item元素时,currNode指向的是item的前一个元素,因为寻找item元素时,用的是currNode.next.data是否等于item。 此时直接将currNode.next设置为其再后面一个元素即可。

// 在单链表中删除一个节点

稍微有些复杂的函数基本阐述完毕,下面是单链表数据结构的整体代码:

class 

单链表的测试

实现了单链表的各个函数后总要来测试下,不然谁知道你写的到底对不对是吧。右边的注释为输出。

let 

可以发现,所写的函数都达到了预定的功能。

判断单链表中是否有环

有环的链表

类似于上图这样的,是一个有环的单链表。

现在来构建下它:

var 

写个函数来判断链表是否有环,使用了快慢指针,如果快指针走到最后为null,说明链表没有环,如果两个指针在某个时刻相等了,则说明链表有环。

function 


js 数组 改变长度_使用JS实现链表(1)——单链表相关推荐

  1. js 数组 改变长度_比较JavaScript中的数据结构(数组与对象)

    文末送5本书 在编程中,如果你想继续深入,数据结构是我们必须要懂的一块, 学习/理解数据结构的动机可能会有所不同,一方面可能是为了面试,一方面可能单单是为了提高自己的技能或者是项目需要.无论动机是什么 ...

  2. js 数组 改变长度_Java数组,什么是Java数组?Java数组学习

    人的生命,似洪水奔流,不遇着岛屿和暗礁,难以激起美丽的浪花. 简介 数组是相同类型数据的有序集合 比如:[1,2,3] ['a','b','c'] 数组描述的是相同类型的若干个数据,按照一定的先后顺序 ...

  3. c语言数组指定位置插入和删除_玩转C语言链表,单链表/双向链表的建立/遍历/插入/删除...

    最近临近期末的C语言课程设计比平时练习作业一下难了不止一个档次,第一次接触到了C语言的框架开发,了解了View(界面层).Service(业务逻辑层).Persistence(持久化层)的分离和耦合, ...

  4. c++ 构造函数数组_从 JS 数组操作到 V8 array.js

    前言 最近在写面试编程题,经常用到数组,经常想偷个懒,用它提供的方法,奈何还是对数组方法使用不熟练,导致写了很多的垃圾代码,很多地方稍加修改的话肯定变得简洁高效优雅? 所以✍这篇文章本着了解一下Jav ...

  5. JS数组删除指定下标元素 JS删除对象指定元素

    一.JS数组删除指定下标元素 splice方法--Array.splice(index,n) 参数语义化理解:删除以下标index为起点的n个元素.(之后的元素会往前移动) 注意:splice会直接改 ...

  6. js声明数组 js数组如何获取真实对象 js数组处理null值情况 js数组通过下标赋值和push赋值的区别 loopback4的基础使用

    目录 问题来源 js数组 数组通过下标赋值 数组通过push赋值 总结 loopback4 安装 创建项目 项目启动 访问项目 创建HelloController 运行访问HelloControlle ...

  7. js数组获取index_想自学JS吗?想提升JS底层原理吗?76张脑图带你彻底搞懂原生JS...

    本篇内容适用于:初学前端:及工作时间不久想回顾基础的各位伙伴: 文章主要由图片组成,看起来可能会不太方便,适合保存下来单张查看: 既然来了,就看看在走吧,总会有些收获的: 一.前端发展史 二.JS基础 ...

  8. html表单判断字符数,JS判断字符串长度,结合element el-input el-form 表单验证(英文占1个字符,中文汉字占2个字符)...

    首先看看判断字符串长度的几种方法(英文占1个字符,中文汉字占2个字符) 方法一: function strlen(str) { var len = 0; for (var i = 0; i < ...

  9. js 模拟点击_爬虫js逆向之无限debugger--抖音第三方数据分析平台的坑

    爬虫js逆向系列 我会把做爬虫过程中,遇到的所有js逆向的问题分类展示出来,以现象,解决思路,以及代码实现,这三方面解析,供大家参考爬虫认知 在程序猿所有的方向中,爬虫是离money最近的一个方向,你 ...

最新文章

  1. 图神经网络越深,表现就一定越好吗?
  2. json下linux64位版本,linux下正确安装jsoncpp(示例代码)
  3. J2EE 13规范(4)-JSP
  4. 【转】jqGrid学习之参数
  5. linux ls命令全称,Linux ls命令的使用
  6. 获取Class类对象的三种方式
  7. 转:java网络编程-HTTP编程
  8. CSS——设置第一个以外的元素样式:not(:first-child),设置最后一个除外的元素样式:not(:last-child)
  9. beego 例子_beego框架代码分析
  10. 大型网站架构演变和知识体系【转载】
  11. 简历是这样选出来的!
  12. Unity3D零基础视频教程下载(全套+视频)
  13. 网银支付接口编程资料汇总
  14. 弃猪 [ 白话文/文言文双版本 ]
  15. Win10系统打不开html文件,电脑无法打开html文件
  16. 机器学习(第二章)—— 模型评估
  17. 现代交换技术学习笔记
  18. Java clk啥意思_clock (CLK)是什么意思
  19. css 两个元素重叠,css元素如何重叠?
  20. sql怎么给字段备注

热门文章

  1. 性能测试——loadrunner_添加多个主机发送请求
  2. 浙江省二级计算机试题,2015浙江省计算机等级考试试题 二级ACCESS考试题库
  3. Flask常见问题记录
  4. 亲密关系-【沟通日志】-如何不再重蹈覆辙
  5. 面试必考题:基本95%的面试都会被问到的?
  6. python编程字符输入连接_python字符串连接的N种方式总结
  7. python nonlocal的用法_python global和nonlocal用法解析
  8. BP神经网络:feedforwardnet版回归预测
  9. android ble readcharacteristic,android 4.3蓝牙ble不要调用onCharacteristicRead()
  10. Efficient Inference in Fully Connected CRFs with Gaussian Edge Potential