题解 | #判断链表中是否有环#

判断链表中是否有环

https://www.nowcoder.com/practice/650474f313294468a4ded3ce0f7898b9

判断链表中是否有环

目标

我们需要判断一条项链(链表)是不是闭合成圈的。如果是闭合成圈的,我们就说这条项链有“环”,并返回 true;如果没有闭合成圈,我们就说这条项链没有“环”,并返回 false

示例

假设我们有两条项链:

  • 第一条项链:3 → 2 → 0 → -4,并且 -4 指向第 2 个珠子(形成环)。
  • 第二条项链:1,没有任何珠子指向其他珠子(没有环)。

解释步骤

1. 准备两个“兔子”

想象一下,我们有两个“兔子”,一个跑得慢,一个跑得快。慢兔子每次跳一步,快兔子每次跳两步。

ListNode slow = head; // 慢兔子
ListNode fast = head; // 快兔子

2. 让兔子开始跑

让两个兔子从项链的起点开始跑。慢兔子每次跳一步,快兔子每次跳两步。

while (fast != null && fast.next != null) {
    slow = slow.next; // 慢兔子跳一步
    fast = fast.next.next; // 快兔子跳两步
}

3. 观察兔子

如果项链有环,快兔子最终会追上慢兔子。如果项链没有环,快兔子会一直跑到项链的尽头(null)。

if (slow == fast) {
    return true; // 如果快兔子追上了慢兔子,说明有环
}

4. 结果

如果快兔子跑到了项链的尽头,说明项链没有环,返回 false

return false; // 如果快兔子跑到尽头,说明没有环

示例解析

示例 1

输入:{3,2,0,-4},1

  1. 初始化兔子:
  2. 慢兔子和快兔子都站在 3 上。
  3. 让兔子跑:
  4. 慢兔子跳到 2,快兔子跳到 0。
  5. 慢兔子跳到 0,快兔子跳到 -4。
  6. 慢兔子跳到 -4,快兔子跳回 2(因为 -4 指向 2)。
  7. 观察兔子:
  8. 快兔子追上了慢兔子,说明有环。
  9. 结果:
  10. 返回 true。

示例 2

输入:{1},-1

  1. 初始化兔子:
  2. 慢兔子和快兔子都站在 1 上。
  3. 让兔子跑:
  4. 快兔子跑到项链的尽头(null)。
  5. 观察兔子:
  6. 快兔子没有追上慢兔子,说明没有环。
  7. 结果:
  8. 返回 false。

示例 3

输入:{-1,-7,7,-4,19,6,-9,-5,-2,-5},6

  1. 初始化兔子:
  2. 慢兔子和快兔子都站在 -1 上。
  3. 让兔子跑:
  4. 慢兔子跳到 -7,快兔子跳到 -4。
  5. 慢兔子跳到 7,快兔子跳到 -5。
  6. 慢兔子跳到 -4,快兔子跳到 -5。
  7. 慢兔子跳到 19,快兔子跳到 -5。
  8. 慢兔子跳到 6,快兔子跳到 -5。
  9. 慢兔子跳到 -9,快兔子跳到 -5。
  10. 慢兔子跳到 -5,快兔子跳到 -5。
  11. 观察兔子:
  12. 快兔子追上了慢兔子,说明有环。
  13. 结果:
  14. 返回 true。

最后附上完整代码

public class Solution {
    public boolean hasCycle(ListNode head) {
        if (head == null || head.next == null) {
            return false; // 如果链表为空或只有一个节点,不可能有环
        }

        ListNode slow = head; // 慢指针
        ListNode fast = head.next; // 快指针

        while (fast != null && fast.next != null) {
            if (slow == fast) {
                return true; // 如果快慢指针相遇,说明有环
            }
            slow = slow.next; // 慢指针向前一步
            fast = fast.next.next; // 快指针向前两步
        }

        return false; // 如果快指针到达尾部,说明没有环
    }
}

#牛客创作赏金赛#
小学生都能看懂的算法 文章被收录于专栏

主要面向小白的算法文章。以小学生都能看懂为目标而编写,顺便巩固下自己。

全部评论

相关推荐

10-09 00:50
已编辑
长江大学 算法工程师
不期而遇的夏天:1.同学你面试评价不错,概率很大,请耐心等待;2.你的排名比较靠前,不要担心,耐心等待;3.问题不大,正在审批,不要着急签其他公司,等等我们!4.预计9月中下旬,安心过节;5.下周会有结果,请耐心等待下;6.可能国庆节前后,一有结果我马上通知你;7.预计10月中旬,再坚持一下;8.正在走流程,就这两天了;9.同学,结果我也不知道,你如果查到了也告诉我一声;10.同学你出线不明朗,建议签其他公司保底!11.同学你找了哪些公司,我也在找工作。
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务