首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
SAAS
ToB门户
了解全球最新的ToB事件
论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
微博
Follow
记录
Doing
博客
Blog
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
排行榜
Ranklist
相册
Album
应用中心
qidao123.com ToB IT社区-企服评测·应用市场
»
论坛
›
数据库
›
分布式数据库
›
快慢指针【中分链表、判断链表中是否存在环】 ...
返回列表
发新帖
快慢指针【中分链表、判断链表中是否存在环】
[复制链接]
发表于 2025-10-20 02:32:46
|
显示全部楼层
|
阅读模式
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要
登录
才可以下载或查看,没有账号?
立即注册
×
一、中分链表:找到链表的中心节点
Java 实现
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
public class MiddleOfLinkedList {
public ListNode findMiddleNode(ListNode head) {
if (head == null) {
return null;
}
ListNode slow = head;
ListNode fast = head;
// 快指针每次走两步,慢指针每次走一步
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
}
// 慢指针指向中间节点
return slow;
}
public static void main(String[] args) {
// 示例链表:1 -> 2 -> 3 -> 4 -> 5
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
MiddleOfLinkedList solution = new MiddleOfLinkedList();
ListNode middle = solution.findMiddleNode(head);
System.out.println("中间节点值: " + middle.val); // 输出: 3
}
}
复制
代码
示例
输入链表:1 -> 2 -> 3 -> 4 -> 5
输出:3
输入链表:1 -> 2 -> 3 -> 4 -> 5 -> 6
输出:4
二、判断链表中是否存在环
Java 实现
class ListNode {
int val;
ListNode next;
ListNode(int val) {
this.val = val;
this.next = null;
}
}
public class LinkedListCycle {
public ListNode detectCycle(ListNode head) {
if (head == null || head.next == null) {
return null;
}
ListNode slow = head;
ListNode fast = head;
// 判断是否有环
while (fast != null && fast.next != null) {
slow = slow.next;
fast = fast.next.next;
// 快慢指针相遇,说明有环
if (slow == fast) {
break;
}
}
// 无环
if (fast == null || fast.next == null) {
return null;
}
// 找到环的入口
fast = head;
while (fast != slow) {
fast = fast.next;
slow = slow.next;
}
return slow;
}
public static void main(String[] args) {
// 示例链表:1 -> 2 -> 3 -> 4 -> 5 -> 2(节点5指向节点2,形成环)
ListNode head = new ListNode(1);
head.next = new ListNode(2);
head.next.next = new ListNode(3);
head.next.next.next = new ListNode(4);
head.next.next.next.next = new ListNode(5);
head.next.next.next.next.next = head.next; // 形成环
LinkedListCycle solution = new LinkedListCycle();
ListNode cycleNode = solution.detectCycle(head);
if (cycleNode != null) {
System.out.println("环的入口节点值: " + cycleNode.val); // 输出: 2
} else {
System.out.println("链表中无环");
}
}
}
复制
代码
示例
输入链表:1 -> 2 -> 3 -> 4 -> 5 -> 2(节点5指向节点2,形成环)
输出:2
输入链表:1 -> 2 -> 3 -> 4 -> 5
输出:链表中无环
三、核心头脑总结
快慢指针的速率差
:
快指针每次移动两步,慢指针每次移动一步;
在中分链表中,快指针到达末端时,慢指针恰恰在中心;
在判断环时,快指针会追上慢指针。
时间复杂度
:
中分链表:O(n),此中 n 是链表长度;
判断环:O(n),最多遍历链表两次。
空间复杂度
:O(1),只使用了常数级别的额外空间。
四、练习题
中分链表
:
输入:1 -> 2 -> 3 -> 4 -> 5 -> 6
输出:4
判断环
:
输入:1 -> 2 -> 3 -> 4 -> 5 -> 3(节点5指向节点3,形成环)
输出:3
通过
Java 实现
快慢指针本领,可以高效办理链表中的常见标题。把握这一本领,链表标题将不再是困难!
回复
使用道具
举报
返回列表
河曲智叟
+ 我要发帖
登录后关闭弹窗
登录参与点评抽奖 加入IT实名职场社区
去登录
微信订阅号
微信服务号
微信客服(加群)
H5
小程序
快速回复
返回顶部
返回列表