leetcode题目解析(js)--链表
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保存前一个节点, 主要逻辑分三步:
- 修改cur的next,指向前一个节点,即prev
- 保存当前节点cur为prev,供下一个节点使用
- 移动当前节点指针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
};
复制代码
解题思路:
- 先用快慢指针方法确定链表是否有环
- 如果有环的,慢指针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)--链表相关推荐
- Leetcode中二叉树中的搜索相关题目解析以及java实现
Leetcode中二叉树中的搜索相关题目解析以及java实现 这一类的题目其实稍微有一些杂,基本就是在二叉树中寻找一些或者某个特定值,题目比较多,我们会通过两道三篇来总结,不过总体来说也基本上就是BF ...
- LeetCode 5955. 摘水果 题目解析
LeetCode 5955. 摘水果 ⭐️⭐️⭐️⭐️⭐️ 5955. 摘水果 #前缀和 #二分查找 1.题目解析 这是LeetCode周赛中的最后一题,也是我觉得迄今为止离AC最近的一次
- 【数据结构与算法】03 链表(基础知识+面试高频leetcode题目)
目录 数组&链表基础 高频面试题(leetcode) 206 反转链表(常考) 方法1:迭代算法(双指针)(cpp&python) 方法2:递归解法 妖魔化的双指针算法. 24 两两交 ...
- Leetcode分类解析:组合算法
Leetcode分类解析:组合算法 所谓组合算法就是指:在解决一些算法问题时,需要产生输入数据的各种组合.排列.子集.分区等等,然后逐一确认每种是不是我们要的解.从广义上来说,组合算法可以包罗万象,甚 ...
- 刻意练习:LeetCode实战 -- Task09. 环形链表
背景 本篇图文是LSGO软件技术团队组织的 第二期基础算法(Leetcode)刻意练习训练营 的打卡任务.本期训练营采用分类别练习的模式,即选择了五个知识点(数组.链表.字符串.树.贪心算法),每个知 ...
- LeetCode实战:排序链表
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Sort a link ...
- LeetCode实战:删除链表中的节点
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a fun ...
- LeetCode实战:反转链表
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Reverse a s ...
- LeetCode实战:相交链表
背景 为什么你要加入一个技术团队? 如何加入 LSGO 软件技术团队? 我是如何组织"算法刻意练习活动"的? 为什么要求团队的学生们写技术Blog 题目英文 Write a pro ...
最新文章
- 在Eclipse中使用JUnit4进行单元测试
- 关于Debug和Release之本质区别的讨论
- XCTF-MISC-新手区:stegano
- SAP UI5 应用开发教程之二十九 - SAP UI5 的路由和导航功能介绍
- Java——设计模式(简单工厂模式)
- Vim案列掌握vim的基本操作——案例一:vim创建编写txt文件
- python打开外部应用
- 左右mysql事务提交
- MyBatis调用存储过程,含有返回结果集、return参数和output参数
- CF1040B Shashlik Cooking
- 网站服务器变更ip后更新域名,服务器变更后域名需要重新备案吗
- python图片剪裁(图片按四个点坐标剪裁)
- Python 小提琴图(violinplot)
- 三项式与组合数(lucas板子)
- (第二章) hive安装之Hive安装部署
- stata统计分析及行业应用案例分析_描述性统计分析的应用——基于描述性统计分析识别优质股票...
- 小脚本之windows批量修改文件后缀名
- python链接sqlite3插入input显示No such column:xxx
- Android7工程模式,安卓手机怎么进工程模式 安卓手机进工程模式教程【详解】
- FDTD 中石墨烯材料如何设置