[Java·算法·简单] LeetCode 141. 环形链表 详细解读

简介: [Java·算法·简单] LeetCode 141. 环形链表 详细解读

题目

给你一个链表的头节点 head ,判断链表中是否有环。


如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。


如果链表中存在环 ,则返回 true 。 否则,返回 false 。


示例

示例1

输入:head = [3,2,0,-4], pos = 1

输出:true

解释:链表中有一个环,其尾部连接到第二个节点。


8af83736ff0f74b0b6d1b1997fa1ee5e_7035a5b8c6668aaa3ef536f880df6cf6.png

输入:head = [1,2], pos = 0

输出:true

解释:链表中有一个环,其尾部连接到第一个节点。


示例3

输入:head = [1], pos = -1

输出:false

解释:链表中没有环。


提示

👉️ 力扣原文

class ListNode {
    int val;
    ListNode next;
    ListNode(int x) {
        val = x;
        next = null;
    }
}
 
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; // 快指针追上慢指针,说明链表中存在环
    }
}


详细解读

这个方法使用了双指针技术来检测链表中是否存在环。下面是对方法的详细解读:


  1. 初始条件检查
  • 方法开始时,首先检查链表是否为空,或者是否只有一个节点。如果链表为空或者只有一个节点,肯定不存在环,因此直接返回 false
  1. 初始化指针
  • 创建两个指针 slowfast,初始时分别指向链表的头节点 headhead.next
  • 这里快指针 fast 比慢指针 slow 快一步是为了保证在检测环时不会因为快指针提前到达末尾而遗漏环的检测。

3.循环检测

  • 使用一个 while 循环,条件是 slow 指针不等于 fast 指针。
  • 在循环中,先检查快指针 fast 是否为 null,如果是,说明已经到达了链表的末尾,即链表中不存在环,直接返回 false。
  • 然后让慢指针 slow 前进一步,即 slow = slow.next。
  • 接着让快指针 fast 前进两步,即 fast = fast.next.next。
  • 循环结束的条件是 slow 和 fast 相遇,即两个指针指向了同一个节点,表示链表中存在环。


4.返回结果

  • 如果循环结束时,slowfast 相遇了,说明链表中存在环,返回 true
  • 如果循环结束时,快指针 fast 到达了链表的末尾,则说明链表中不存在环,返回 false


这种方法的时间复杂度是 O(n),其中 n 是链表的节点数,因为在最坏情况下,快指针 fast 最多会遍历整个链表一次。而空间复杂度是 O(1),因为只使用了常数个额外的指针。

相关文章
|
1月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
35 1
|
1月前
Leetcode第21题(合并两个有序链表)
这篇文章介绍了如何使用非递归和递归方法解决LeetCode第21题,即合并两个有序链表的问题。
50 0
Leetcode第21题(合并两个有序链表)
|
1月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
70 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
【❤️算法笔记❤️】-每日一刷-19、删除链表的倒数第 N个结点
69 1
|
1月前
|
算法 索引
❤️算法笔记❤️-(每日一刷-141、环形链表)
❤️算法笔记❤️-(每日一刷-141、环形链表)
46 0
|
1月前
|
算法
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
【❤️算法笔记❤️】-(每日一刷-876、单链表的中点)
44 0
|
1月前
|
算法
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
【❤️算法笔记❤️】-每日一刷-23、合并 K 个升序链表
32 0
|
1月前
|
存储 算法
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
【❤️算法笔记❤️】-每日一刷-21、合并两个有序链表
93 0
|
23天前
|
算法 安全 搜索推荐
2024重生之回溯数据结构与算法系列学习之单双链表精题详解(9)【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构王道第2.3章之IKUN和I原达人之数据结构与算法系列学习x单双链表精题详解、数据结构、C++、排序算法、java、动态规划你个小黑子;这都学不会;能不能不要给我家鸽鸽丢脸啊~除了会黑我家鸽鸽还会干嘛?!!!
|
23天前
|
存储 Web App开发 算法
2024重生之回溯数据结构与算法系列学习之单双链表【无论是王道考研人还是IKUN都能包会的;不然别给我家鸽鸽丢脸好嘛?】
数据结构之单双链表按位、值查找;[前后]插入;删除指定节点;求表长、静态链表等代码及具体思路详解步骤;举例说明、注意点及常见报错问题所对应的解决方法