206. 反转链表

反转一个单链表。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL

解法:

var reverseList = function(head) {let cur = head, prev = nullwhile(cur) {[cur.next, prev, cur] = [prev, cur, cur.next]}return prev
};
复制代码

思路分析:prev保存前一个节点, 主要逻辑分三步:

  1. 修改cur的next,指向前一个节点,即prev
  2. 保存当前节点cur为prev,供下一个节点使用
  3. 移动当前节点指针cur到下一个节点cur.next

24. 两两交换链表中的节点

给定一个链表,两两交换其中相邻的节点,并返回交换后的链表。 你不能只是单纯的改变节点内部的值,而是需要实际的进行节点交换。

示例:

给定 1->2->3->4, 你应该返回 2->1->4->3.

解法一:

var swapPairs = function(head) {let node = new ListNode(0) //新建一个节点,用于保存head节点node.next = headlet prev = nodewhile(prev.next && prev.next.next) {let a = prev.nextlet b = a.nextprev.next = a.nexta.next = b.nextprev = b.next = a}return node.next
};
复制代码

解题思路: 定义一个新的头节点node,将头节点next指向head,定义prev, a, b分别指向前三项,第一遍循环如下图:

循环过程中node始终指向自定义的头结点,而node.next即为真正的头节点。
遍历第二遍时,a, b分别指向3,4,执行流程同上,执行完第二遍即结束循环。

解法二:

var swapPairs = function(head) {if(!head) return nullif(!head.next) return headlet temp = head.nexthead.next = swapPairs(temp.next)temp.next = headreturn temp
};
复制代码

解题思路:主要逻辑是head.next指向递归返回的上一个temp,同时修改temp.next为head,实现后一个节点指向前一个节点,同时前一个节点指向递归返回的节点,最后swapPairs接收到的就是最后返回的temp,即第二个节点2.

141. 环形链表

给定一个链表,判断链表中是否有环。

示例:

输入:head = [3,2,0,-4], 输出:true

解法一:使用快慢指针,快指针每次走两步,慢指针每次走一步,如果有环,二者必定会碰到一起;

var hasCycle = function(head) {let fast = slow = headwhile(fast && slow && fast.next) { //fast.next不存在说明链表已走完slow = slow.nextfast = fast.next.nextif(fast === slow) {return true}}return false
};
复制代码

解法二:使用Set保存每个节点的地址,如果有环,Set里元素必定会重复;

var hasCycle = function(head) {let set = new Set()while(head) {if(set.has(head)) return trueset.add(head)head = head.next}return false
};
复制代码

142. 环形链表 II

给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

示例:

输入:head = [3,2,0,-4]
输出:tail connects to node index 1

解法一:

var detectCycle = function(head) {let set = new Set()let cur = headwhile(cur) {if(set.has(cur)) return curset.add(cur)cur = cur.next}return null
};
复制代码

解题思路:用Set保存每次遍历的地址,遍历时发现地址重复即为入口节点

解法二:

var detectCycle = function(head) {let fast = slow = headwhile(slow && fast && fast.next) {slow = slow.nextfast = fast.next.nextif(slow === fast) {slow = headwhile(slow !== fast) {slow = slow.nextfast = fast.next}return fast}}return null
};
复制代码

解题思路:

  1. 先用快慢指针方法确定链表是否有环
  2. 如果有环的,慢指针slow重新从head出发,slow,fast每次都走一步,如果重合,重合处必为环的入口;

入口解释一下:

首先第一次遍历后假设在C点相遇,此时:

慢指针走的S1 = |AB| + |BC|
快指针走的S2 = 2 * ( |AB| + |BC| )

在另一个角度,S2 走的距离就是 |AB| + |BC| + n * s (s为环的大小),即

快指针走的S2 = |AB| + |BC| + n * s

所以可以得到

2 * ( |AB| + |BC| ) = |AB| + |BC| + n * s
可以得到:|AB| = n * s - |BC|

可以看出如果slow从A点开始,fast从相遇点C开始,两者以同样速度必会在B点相遇

leetcode题目解析(js)--链表相关推荐

  1. Leetcode中二叉树中的搜索相关题目解析以及java实现

    Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...

  2. LeetCode 5955. 摘水果 题目解析

    LeetCode 5955. 摘水果 ⭐️⭐️⭐️⭐️⭐️ 5955. 摘水果 #前缀和 #二分查找 1.题目解析 这是LeetCode周赛中的最后一题,也是我觉得迄今为止离AC最近的一次

  3. 【数据结构与算法】03 链表(基础知识+面试高频leetcode题目)

    目录 数组&链表基础 高频面试题(leetcode) 206 反转链表(常考) 方法1:迭代算法(双指针)(cpp&python) 方法2:递归解法 妖魔化的双指针算法. 24 两两交 ...

  4. Leetcode分类解析:组合算法

    Leetcode分类解析:组合算法 所谓组合算法就是指:在解决一些算法问题时,需要产生输入数据的各种组合.排列.子集.分区等等,然后逐一确认每种是不是我们要的解.从广义上来说,组合算法可以包罗万象,甚 ...

  5. 刻意练习:LeetCode实战 -- Task09. 环形链表

    背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...

  6. LeetCode实战:排序链表

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Sort a link ...

  7. LeetCode实战:删除链表中的节点

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a fun ...

  8. LeetCode实战:反转链表

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Reverse a s ...

  9. LeetCode实战:相交链表

    背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a pro ...

最新文章

  1. 在Eclipse中使用JUnit4进行单元测试
  2. 关于Debug和Release之本质区别的讨论
  3. XCTF-MISC-新手区:stegano
  4. SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍
  5. Java——设计模式(简单工厂模式)
  6. Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件
  7. python打开外部应用
  8. 左右mysql事务提交
  9. MyBatis调用存储过程,含有返回结果集、return参数和output参数
  10. CF1040B Shashlik Cooking
  11. 网站服务器变更ip后更新域名,服务器变更后域名需要重新备案吗
  12. python图片剪裁(图片按四个点坐标剪裁)
  13. Python 小提琴图(violinplot)
  14. 三项式与组合数(lucas板子)
  15. (第二章) hive安装之Hive安装部署
  16. stata统计分析及行业应用案例分析_描述性统计分析的应用——基于描述性统计分析识别优质股票...
  17. 小脚本之windows批量修改文件后缀名
  18. python链接sqlite3插入input显示No such column:xxx
  19. Android7工程模式,安卓手机怎么进工程模式 安卓手机进工程模式教程【详解】
  20. FDTD 中石墨烯材料如何设置

热门文章

  1. Android自定义Shape
  2. DNN模块开发入门指导
  3. 基因注释神器UCSC Genome Browser使用教程
  4. Spring(三)——HelloSpring、IOC创建对象的方式、属性注入、自动装配、使用注解开发
  5. c 调用易语言dll字节集,总结VC与易语言DLL互相调用的方法
  6. python爬虫 小白轻松从0到1_小白学 Python 爬虫(1):开篇
  7. python flask服务_在python中Flask配置服务
  8. 机器人学习--卡尔曼滤波及各种滤波解析
  9. 图像分类简单介绍-转
  10. 树莓派4b设置RTC时钟模块DS3231