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.两数相加(中等)

题目要求:

解题思路:

  1. 思路: 链表问题,遍历l1,l2,赋值给l3
  2. 边界条件
    * 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链表相关推荐

  1. JavaScript链表的基本操作完整版

    JavaScript链表的基本操作完整版 一:定义单向链表节点类 //定义单向链表的节点类 class Node{constructor(data){this.data = data //节点的数据域 ...

  2. javascript map 排序_数据结构-JavaScript字典结构的编程实现

    字典是一类特殊的数据元素的集合,字典的基本单元为数对,所谓数对是指类似(key,value)形式的数据.每一个数对结构包括了关键字key与该元素对应的value值,在一个普通字典所组成的数对集合中,关 ...

  3. c++矩阵类_数据结构-JavaScript矩阵类的设计与实现

    矩阵是线性代数课学习的重点内容之一,也是线性代数常见工具之一,在应用数学.统计分析.计算机科学.计算机图像处理级物理等多学科中均有应用.矩阵主要是指数据的行列排列的形式,由行row与列col所组成,在 ...

  4. 用JavaScript来实现链表LinkedList

    本文版权归博客园和作者本人共同所有,转载和爬虫请注明原文地址. 写在前面 好多做web开发的朋友,在学习数据结构和算法时可能比较讨厌C和C++,上学的时候写过的也忘得差不多了,更别提没写过的了.但幸运 ...

  5. 数据结构与算法JavaScript描述——链表

    1.数组的缺点 数组不总是组织数据的最佳数据结构,原因如下. 在很多编程语言中,数组的长度是固定的,所以当数组已被数据填满时,再要加入新的元素就会非常困难. 在数组中,添加和删除元素也很麻烦,因为需要 ...

  6. 【javascript】数据结构-链表

    // 创建一个链表 function LinkedList(){// 创建一个Node辅助类,表示需要加入列表的项,它包含一个element属性,即表示需要加入到列表中的值,next属性表示指向下一个 ...

  7. JavaScript实现链表reverseTraversal反向遍历算法(附完整源码)

    JavaScript实现链表reverseTraversal反向遍历算法(附完整源码) reverseTraversal.js完整源代码 reverseTraversal.js完整源代码 functi ...

  8. JavaScript数据结构与算法——链表详解(下)

    在JavaScript数据结构与算法--链表详解(上)中,我们探讨了一下链表的定义.实现原理以及单链表的实现.接下来我们进一步了解一下链表的其他内容. 1.双向链表 双向链表实现原理图: 与单向链表不 ...

  9. JavaScript数据结构与算法——链表详解(上)

    注:与之前JavaScript数据结构与算法系列博客不同的是,从这篇开始,此系列博客采用es6语法编写,这样在学数据结构的同时还能对ECMAScript6有进一步的认识,如需先了解es6语法请浏览ht ...

最新文章

  1. python turtle画气球-菲菲用python编程绘制的父亲节礼物
  2. 中国大学MOOC 编译原理 第8讲测验(计分)
  3. Android---AlertDialog
  4. Python 爬虫进阶二之 PySpider 框架安装配置
  5. [iCustomer] 项目技术简介
  6. 【Python学习笔记】集合set
  7. Google Cloud资源层级, IAM Identity and Access Management, 控制台云交互
  8. android sns空间代码,Android视频分享SNS类APP完整源码(服务端+客户端)
  9. PHP从入门到能用(十)创建新闻网站数据库
  10. VC打印机使用 win95环境的下例子测试
  11. 汽车软件系统常用简称
  12. android ro.boot.mac,Android Verified Boot浅知分享
  13. MPL2.0协议简介——Mozilla Public License Version 2.0
  14. 阿里云免费SSL证书申请
  15. 脑电图(EEG)信号去噪方法简述
  16. 遇见王沥川的人生感悟_遇见王沥川的人生感悟
  17. 【ManageEngine卓豪】助力黄石爱康医院实现智能批量化网络设备配置管理
  18. D19:Duplicate Number(重复数字,翻译+题解)
  19. windows访问虚拟机DNS服务器,windows虚拟机中DNS服务配置
  20. 隐藏电话号码中间四位

热门文章

  1. oracle 顶级,15位Oracle顶级专家经验荟萃
  2. TM4C123笔记(五、SSI(SPI))
  3. linux下使用find命令时报错“find: paths must precede expression”
  4. yzm10铺瓷砖 一只小蜜蜂 ycb与取款机
  5. matlab 等高线图限制范围,matlab等高线图的初级问题,matlab画等高线问题,请高人解答。详细请看补充。...
  6. ESP链接小米手机WiFi热点测试
  7. Tiktok产品识别码GTIN
  8. 流程图制作软件使用方法:绘制一份漂亮的流程图也很简单
  9. 音乐播放器的实现过程及四大组件入门
  10. 求助贴 电压跟随器波形变形问题