• LeetCode 图解 | 141.环形链表


    题目描述

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

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

    如果链表中存在环 ,则返回 true 。 否则,返回 false 。
    在这里插入图片描述

    思路分析

    快慢指针思想

    本题我们将采用快慢指针解决,那什么是快慢指针思想呢?

    假设两个指针,一个快指针和一个慢指针(两个指针的指向不能相同,否则还没开始就结束判断条件了,因为它们相遇了),那什么又是快慢指针呢?慢指针每次走一步(即slow.next),快指针每次走两步(即fast.next.next)。
    在这里插入图片描述
    按照这步伐,如果是有环的,快慢指针必定会进环相遇,相遇就是说快慢指针所指向的节点都是相同。打个简单的例子,小明和小红在操场跑步,小明跑着快,小红跑着慢,那跑着快的肯定会追上跑着慢的,这就是相遇。
    在这里插入图片描述

    代码实现

    /**
     * @Author: 爱摸鱼的TT~
     * @Description: https://leetcode.cn/problems/linked-list-cycle/
     * @Date Created in 2022-11-20 15:20
     * @Modified By:
     */
    public class _141_环形链表 {
    
        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){
                slow = slow.next;
                fast = fast.next.next;
                if(slow == fast){
                    return true;
                }
            }
            return false;
        }
    
        class ListNode {
             int val;
             ListNode next;
             ListNode(int x) {
                 val = x;
                 next = null;
             }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述
    有同学疑问着:在while循环的判断条件,能不能只写其一呢?答案肯定是不行的啦,why?

    大家想想,如果去掉 fast != null ,那这时有可能 fast.next.next = null ,这时再次进行条件判断,是不是会报空指针异常呢;那如果去掉 fast.next != null 会造成什么后果?有可能 fast.next = null 这时 fast = null.next 照样是空指针异常。因此,这两个条件都必须满足。

  • 相关阅读:
    ipvs之ipvs0网卡
    C语言 二维数组和函数综合编程练习
    h2database BTree 设计实现与查询优化思考
    Linux学习-41-检测和修复文件系统fsck命令用法
    微信小程序云开发教程——墨刀原型工具入门(表单组件)
    Chrome和Firefox哪款浏览器的密码管理更安全
    Java I/O模型发展以及Netty网络模型的设计思想
    【高等数学】一些零碎知识点
    直播课堂系统03-model类及实体
    Lambda表达式
  • 原文地址:https://blog.csdn.net/weixin_46312449/article/details/128068718