如何判断链表有无环
1. 流程图
journey
title 判断链表有无环
section 步骤
判断链表是否为空 --> 初始节点
判断链表是否只有一个节点 --> 单节点
使用快慢指针遍历链表 --> 快慢指针
判断快慢指针是否相遇 --> 相遇
判断快指针是否到达链表尾部 --> 未相遇
2. 代码实现
步骤1:判断链表是否为空
// 判断链表是否为空
if (head == null) {
// 链表为空,没有环
return false;
}
步骤2:判断链表是否只有一个节点
// 判断链表是否只有一个节点
if (head.next == null) {
// 链表只有一个节点,没有环
return false;
}
步骤3:使用快慢指针遍历链表
// 定义快慢指针,初始指向链表头节点
ListNode slow = head;
ListNode fast = head;
步骤4:判断快慢指针是否相遇
while (fast != null && fast.next != null) {
slow = slow.next; // 慢指针每次移动1步
fast = fast.next.next; // 快指针每次移动2步
if (slow == fast) {
// 快慢指针相遇,链表有环
return true;
}
}
步骤5:判断快指针是否到达链表尾部
// 快指针到达链表尾部,链表没有环
return false;
3. 完整代码
public class Solution {
public boolean hasCycle(ListNode head) {
// 判断链表是否为空
if (head == null) {
// 链表为空,没有环
return false;
}
// 判断链表是否只有一个节点
if (head.next == null) {
// 链表只有一个节点,没有环
return false;
}
// 定义快慢指针,初始指向链表头节点
ListNode slow = head;
ListNode fast = head;
// 使用快慢指针遍历链表
while (fast != null && fast.next != null) {
slow = slow.next; // 慢指针每次移动1步
fast = fast.next.next; // 快指针每次移动2步
if (slow == fast) {
// 快慢指针相遇,链表有环
return true;
}
}
// 快指针到达链表尾部,链表没有环
return false;
}
}
4. 总结
以上就是判断链表有无环的完整流程和代码实现。通过使用快慢指针来遍历链表,当快慢指针相遇时,即可判断链表存在环。如果快指针到达链表尾部仍未相遇,则链表没有环。
判断链表环的存在性是面试中常见的问题,使用快慢指针的方法可以在O(n)的时间复杂度内解决该问题。需要注意的是,使用快慢指针时,要确保快指针每次移动两步,慢指针每次移动一步,以确保相遇的正确性。
希望通过本文,能够帮助刚入行的小白开发者理解并掌握判断链表有无环的方法。