当前位置:首页 > Java

java如何确认环

2026-03-24 22:12:50Java

检测链表中的环

在Java中检测链表是否存在环,通常使用快慢指针法(Floyd's Cycle Detection Algorithm)。该方法通过两个指针以不同速度遍历链表,若存在环,快指针最终会追上慢指针。

实现步骤:

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) { val = x; }
}

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false;
        }
        ListNode slow = head;
        ListNode fast = head.next;
        while (slow != fast) {
            if (fast == null || fast.next == null) {
                return false;
            }
            slow = slow.next;
            fast = fast.next.next;
        }
        return true;
    }
}

关键点:

  • 初始化慢指针 slow 指向头节点,快指针 fast 指向头节点的下一个节点。
  • 每次迭代中,慢指针移动一步,快指针移动两步。
  • 如果快指针遇到 null,说明链表无环;若快慢指针相遇,则存在环。

数学证明

假设链表环外部分长度为 a,环内部分长度为 b。快指针每次走两步,慢指针每次走一步,两者速度差为1。当慢指针进入环后,快指针最多需要追赶 b-1 步即可相遇,因此时间复杂度为 O(n)

替代方法:哈希表

另一种方法是使用哈希表记录已访问的节点:

import java.util.HashSet;
import java.util.Set;

public class Solution {
    public boolean hasCycle(ListNode head) {
        Set<ListNode> visited = new HashSet<>();
        while (head != null) {
            if (visited.contains(head)) {
                return true;
            }
            visited.add(head);
            head = head.next;
        }
        return false;
    }
}

优缺点:

java如何确认环

  • 时间复杂度 O(n),空间复杂度 O(n)(需额外存储节点)。
  • 适用于需要记录环入口的场景,但空间效率低于快慢指针法。

标签: java
分享给朋友:

相关文章

如何打开java

如何打开java

打开 Java 程序的方法 通过命令行运行 Java 程序 确保已安装 Java Development Kit (JDK) 并配置环境变量。使用 javac 编译 .java 文件,生成 .clas…

java如何创建类

java如何创建类

创建类的基本语法 在Java中,类通过class关键字定义,语法如下: [访问修饰符] class 类名 { // 成员变量(属性) // 构造方法 // 成员方法 }…

如何运行java文件

如何运行java文件

运行Java文件的方法 确保已安装Java Development Kit (JDK),可通过命令行输入java -version和javac -version验证安装。 编写Java代码并保存为.…

java如何输入数据

java如何输入数据

输入数据的方法 在Java中,输入数据可以通过多种方式实现,具体取决于输入来源(如控制台、文件、网络等)。以下是几种常见的方法: 使用Scanner类从控制台输入 Scanner类是Java中最常用…

java如何遍历map

java如何遍历map

遍历Map的几种方法 在Java中,遍历Map有多种方式,可以根据需求选择合适的方法。以下是常见的几种遍历方式: 使用entrySet遍历 通过entrySet()方法获取键值对的集合,可以同时访问…

java如何打印数组

java如何打印数组

打印数组的方法 在Java中,打印数组有多种方式,以下是几种常见的方法: 使用Arrays.toString()方法 这种方法适用于一维数组,可以快速将数组转换为字符串形式输出: int[] a…