CC10-判断链表中是否有环
目录
一、题目分析
二、解题思路
三、代码实现
四、代码解释
五、测试结果
在链表的相关问题里,判断链表是否存在环是一个基础且重要的题目。今天我们就来学习如何用 Java 解决 “判断链表中是否有环” 的问题。
一、题目分析
题目要求判断给定的链表中是否有环,如果有环则返回 true
,否则返回 false
。例如,输入链表 {3,2,0,-4},1
(表示链表有环,环的入口相关),应返回 true
。
二、解题思路
我们采用快慢指针法:
- 定义两个指针,
slow
(慢指针)每次走 1 步,fast
(快指针)每次走 2 步。 - 如果链表有环,
slow
和fast
会在环内相遇;如果链表无环,fast
会先走到链表末尾(fast
或fast.next
为null
)。
三、代码实现
import java.util.*;// 定义单链表节点类
class ListNode {int val;ListNode next;ListNode(int x) {val = x;next = null;}
}public class Solution {public boolean hasCycle(ListNode head) {// 链表为空,无环if (head == null) {return false;}// 快慢指针ListNode slow = head;ListNode fast = head;// 寻找相遇点while (fast != null && fast.next != null) {slow = slow.next;fast = fast.next.next;// 快慢指针相遇,说明有环if (slow == fast) {return true;}}// 快指针走到链表末尾,无环return false;}// 测试方法public static void main(String[] args) {// 构建有环链表:3 -> 2 -> 0 -> -4 -> 2(形成环)ListNode node1 = new ListNode(3);ListNode node2 = new ListNode(2);ListNode node3 = new ListNode(0);ListNode node4 = new ListNode(-4);node1.next = node2;node2.next = node3;node3.next = node4;node4.next = node2; // 形成环Solution solution = new Solution();boolean hasCycle = solution.hasCycle(node1);// 输出结果,预期为 trueSystem.out.println(hasCycle);}
}
四、代码解释
ListNode
类:定义了单链表的节点结构,包含值val
和指向下一节点的next
。hasCycle
方法:- 先处理链表为空的情况,直接返回
false
。 - 初始化快慢指针
slow
和fast
都指向链表头。 - 在循环中,慢指针每次走 1 步,快指针每次走 2 步。若快慢指针相遇,说明有环,返回
true
;若快指针走到链表末尾(fast
或fast.next
为null
),说明无环,返回false
。
- 先处理链表为空的情况,直接返回
main
方法:构建有环链表,调用hasCycle
方法判断是否有环并输出结果。
五、测试结果
运行测试代码,输出结果为 true
,与预期一致,说明代码正确。
这种方法的空间复杂度为 O(1)(仅使用常数个额外变量),时间复杂度为 O(n)(最多遍历链表一次),高效且符合题目要求。