
【双指针】——快慢指针
利用快慢指针找到环的相遇点。 将快指针从相遇点重新指向链表头部。 同时让两指针以相同速度前进,直到它们再次相遇,此时相遇的节点即为环的起始点。
暴力求解法:先遍历链表,统计长度,再计算中点位置。 快慢指针法:让快指针提前走两步,慢指针走一步,直到快指针达到链表末尾,慢指针即为中点。
让快指针提前走k步,慢指针则按照正常速度前进。 当快指针到达链表末尾时,慢指针的位置即为倒数第k个元素。
发布日期:2021-05-07 21:20:22
浏览次数:24
分类:精选文章
本文共 1787 字,大约阅读时间需要 5 分钟。
双指针技术在链表和数组问题中的应用
在解决链表问题时,我们可以考虑使用双指针技术。双指针主要分为两类:一类是“快慢指针”,主要用于链表问题;另一类是“左右指针”,则更多用于数组或字符串问题。
快慢指针:主要应用于链表问题,常见的场景是判定链表是否包含环。
左右指针:主要用于数组或字符串问题,例如二分搜索。
判定链表是否含有环
要判断一个链表是否含有环,我们可以采用快慢指针技术。这种方法的基本思路是:
- 如果链表不含环,两个指针最终会同时遇到null,表示链表的终点。
- 如果链表含有环,快指针会比慢指针提前绕完环,两者会在某个节点相遇。
实现代码如下:
boolean hasCycle(ListNode head) { if (head == null) return false; List node slow = head; List node fast = head; while (slow != null && fast != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) return true; } return false;}
寻找环的起始位置
如果链表已经确认含有环,我们可以通过以下步骤找出环的起始位置:
代码实现如下:
List node findCycleStart(ListNode head) { List node slow = head, fast = head; while (slow != null && fast != null) { slow = slow.next; fast = fast.next.next; if (slow == fast) break; } List node fast = head; while (slow != fast) { slow = slow.next; fast = fast.next; } return slow;}
寻找无环单链表的中点
寻找单链表的中点可以采用以下方法:
代码实现如下:
List node findMidpoint(ListNode head) { List node slow = head, fast = head; while (fast != null && fast.next != null) { fast = fast.next.next; slow = slow.next; } return slow;}
寻找单链表的倒数第k个元素
要找出单链表的倒数第k个元素,可以采用以下方法:
代码实现如下:
List node findKthLast(ListNode head, int k) { List node slow = head, fast = head; // 使快指针提前走k步 for (int i = 0; i < k; i++) { fast = fast.next; } // 同时让慢指针和快指针以相同速度前进 while (fast != null) { slow = slow.next; fast = fast.next; } return slow;}
以上方法通过快慢指针技术解决了多种链表问题。这种方法不仅时间复杂度优化到了O(n),而且空间复杂度仅使用O(1)额外存储空间,适用于各种链表操作场景。
发表评论
最新留言
逛到本站,mark一下
[***.202.152.39]2025年04月01日 01时35分48秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
css居中方法与双飞翼布局
2019-03-06
Redis进阶实践之十八 使用管道模式提高Redis查询的速度
2019-03-06
多指灵巧手MoveIt!与Gazebo联合仿真框架搭建
2019-03-06
SQL注入
2019-03-06
XCTF-upload1
2019-03-06
sql编写小技巧
2019-03-06
jquery.tmpl 用法(附上详细案例)
2019-03-06
LeetCode 题解 | 1. 两数之和
2019-03-06
#2036:改革春风吹满地
2019-03-06
MPI Maelstrom POJ - 1502 ⭐⭐ 【Dijkstra裸题】
2019-03-06
P1379 八数码难题 ( A* 算法 与 IDA_star 算法)
2019-03-06
按需取余
2019-03-06
算法学习笔记: 珂朵莉树
2019-03-06
算法学习笔记:母函数详解
2019-03-06
Codeforces Round #664 题解(A ~ C)
2019-03-06
Problem 1342B - Binary Period (思维)
2019-03-06
Problem A - Sequence with Digits (数学推导)
2019-03-06
Problem B - Card Constructions (构造)
2019-03-06
Problem 330A - Cakeminator (思维)
2019-03-06