javascript链表
1.什么是链表?
- 链表是多个元素组成的列表
- 元素存储不连续,用next指针连接到一起
- JS中没有链表,但是可以用Object模拟链表
2.常用操作
- 新增节点 append
- 删除节点 remove
- 插入节点 insert
- 获取索引 indexOf
- 链表转字符串 toString
- 获取链表长度 size
- 判断链表是否为空 isEmpty
3.定义链表类
class Node { //节点类//构造函数constructor(val) { this.val = val;this.next = null;}
}
class LinkedList { // 链表类//构造函数constructor() { this.head = null;this.length = 0;}//新增节点append(val) { let node = new Node(val);let current; //暂存当前位置if(this.head === null) { // 如果头结点为空,当前节点作为头结点this.head = node;} else { current = this.head;while(current.next) { //遍历找到链表尾部current = current.next;}current.next = node; //在链表尾部加入新节点}this.length++; //更新链表长度}//删除节点,并获得删除节点的值removeAt(index) { if(index > -1 && index < this.length) { //预防下标越界var current = this.head;//暂存当前位置var previous; //暂存当前位置的前一个var position = 0;if(index === 0) { //要删除的是第一个位置,就得改变头指针指向this.head = current.next;} else { while(position++ < index) { //遍历直到current处于index位置previous = current;current = current.next; //此时current处于index处,previous在index-1处}previous.next = current.next; //改变链表结构,跳过index处}this.length--; //更新链表长度return current.val; //返回index处的值} else { return null; //下标越界返回空}}//插入节点insert(index,val) {if(index > -1 && index <= this.length) { let node = new Node(val);let current = this.head;let previous;let position = 0;if(index === 0) { node.next = current;this.head = node;} else { while(position++ < index) { previous = current;current = current.next;}node.next = current;previous.next = node;}length++;return true; //插入成功} else { return false; //插入失败}}//获取索引indexOf(val) { let current = this.head;let position = 0;while(current) { if(current.val === val) { return position;}position++;current = current.next;}return -1; //未找到索引}//将链表转换成字符串toString() { let current = this.head;let string = '';while(current) { string += current.val + ((current.next ? ',': ''));current = current.next;}return string;}//链表长度size() { return this.length;}//判断链表是否为空isEmpty() { return this.length === 0;}
}
4.LeetCode
接下来使用链表这个数组结构来刷LeetCode有关链表的题目,巩固提升对链表的了解。
题号237.删除链表中的节点(简单)
题目要求:
解题思路:
题目直接给了当前节点,只需用下一位节点覆盖掉当前节点,就可以删除元素
编写代码:
var deleteNode = function(node) {node.val = node.next.val;node.next = node.next.next;
};
复杂度分析
- 事件复杂度O(1)
- 空间复杂度O(1)
题号206.反转链表(简单)
题目要求:
解题思路:
使用双指针遍历,在遍历链表时,将当前节点的指针改为指向前一个节点,需要存储后一个节点指针,最后返回新的头引用。
编写代码:
var reverseList = function(head) {let p1 = head;let p2 = null;while(p1) { const tmp = p1.next; //保存p1下一个节点p1.next = p2; //p1下一个改为p2p2 = p1; //p2指向p1当前位置p1 = tmp; }return p2;
};
复杂度分析:
- 时间复杂度:O(n)
- 空间复杂度:O(1)
题号2.两数相加(中等)
题目要求:
解题思路:
- 思路: 链表问题,遍历l1,l2,赋值给l3
- 边界条件
* l1 或 l2 哪个先结束,结束的用0替补,不影响相加
* 相加后是否产生进位
* 判断最高位是否产生进位,在循环外单独实现
编写代码:
var addTwoNumbers = function(l1, l2) {let l3 = new ListNode();let p1 = l1; //不要直接操作原链表let p2 = l2;let p3 = l3;let carry = 0; //进位判断while(p1 || p2) { const val1 = p1 ? p1.val : 0;const val2 = p2 ? p2.val : 0;const val = Math.floor((val1 + val2 + carry) % 10);carry = Math.floor((val1 + val2 + carry) / 10);p3.next = new ListNode(val);if(p1) p1 = p1.next;if(p2) p2 = p2.next;p3 = p3.next;}if(carry) { //判断最后一位是否有进位p3.next = new ListNode(carry);}return l3.next;
}
复杂度分析:
- 事件复杂度: O(max(m,n)),m,n分别为两个链表的长度
- 空间复杂度: O(1),返回值不计入空间复杂度
javascript链表相关推荐
- JavaScript链表的基本操作完整版
JavaScript链表的基本操作完整版 一:定义单向链表节点类 //定义单向链表的节点类 class Node{constructor(data){this.data = data //节点的数据域 ...
- javascript map 排序_数据结构-JavaScript字典结构的编程实现
字典是一类特殊的数据元素的集合,字典的基本单元为数对,所谓数对是指类似(key,value)形式的数据.每一个数对结构包括了关键字key与该元素对应的value值,在一个普通字典所组成的数对集合中,关 ...
- c++矩阵类_数据结构-JavaScript矩阵类的设计与实现
矩阵是线性代数课学习的重点内容之一,也是线性代数常见工具之一,在应用数学.统计分析.计算机科学.计算机图像处理级物理等多学科中均有应用.矩阵主要是指数据的行列排列的形式,由行row与列col所组成,在 ...
- 用JavaScript来实现链表LinkedList
本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...
- 数据结构与算法JavaScript描述——链表
1.数组的缺点 数组不总是组织数据的最佳数据结构,原因如下. 在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,再要加入新的元素就会非常困难. 在数组中,添加和删除元素也很麻烦,因为需要 ...
- 【javascript】数据结构-链表
// 创建一个链表 function LinkedList(){// 创建一个Node辅助类,表示需要加入列表的项,它包含一个element属性,即表示需要加入到列表中的值,next属性表示指向下一个 ...
- JavaScript实现链表reverseTraversal反向遍历算法(附完整源码)
JavaScript实现链表reverseTraversal反向遍历算法(附完整源码) reverseTraversal.js完整源代码 reverseTraversal.js完整源代码 functi ...
- JavaScript数据结构与算法——链表详解(下)
在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...
- JavaScript数据结构与算法——链表详解(上)
注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...
最新文章
- python turtle画气球-菲菲用python编程绘制的父亲节礼物
- 中国大学MOOC 编译原理 第8讲测验(计分)
- Android---AlertDialog
- Python 爬虫进阶二之 PySpider 框架安装配置
- [iCustomer] 项目技术简介
- 【Python学习笔记】集合set
- Google Cloud资源层级, IAM Identity and Access Management, 控制台云交互
- android sns空间代码,Android视频分享SNS类APP完整源码(服务端+客户端)
- PHP从入门到能用(十)创建新闻网站数据库
- VC打印机使用 win95环境的下例子测试
- 汽车软件系统常用简称
- android ro.boot.mac,Android Verified Boot浅知分享
- MPL2.0协议简介——Mozilla Public License Version 2.0
- 阿里云免费SSL证书申请
- 脑电图(EEG)信号去噪方法简述
- 遇见王沥川的人生感悟_遇见王沥川的人生感悟
- 【ManageEngine卓豪】助力黄石爱康医院实现智能批量化网络设备配置管理
- D19:Duplicate Number(重复数字,翻译+题解)
- windows访问虚拟机DNS服务器,windows虚拟机中DNS服务配置
- 隐藏电话号码中间四位
热门文章
- oracle 顶级,15位Oracle顶级专家经验荟萃
- TM4C123笔记(五、SSI(SPI))
- linux下使用find命令时报错“find: paths must precede expression”
- yzm10铺瓷砖 一只小蜜蜂 ycb与取款机
- matlab 等高线图限制范围,matlab等高线图的初级问题,matlab画等高线问题,请高人解答。详细请看补充。...
- ESP链接小米手机WiFi热点测试
- Tiktok产品识别码GTIN
- 流程图制作软件使用方法:绘制一份漂亮的流程图也很简单
- 音乐播放器的实现过程及四大组件入门
- 求助贴 电压跟随器波形变形问题