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

判断链表中是否有环

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; // 如果快指针到达尾部,说明没有环
    }
}

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

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

全部评论

相关推荐

美团开奖了,谁说测开比后端薪资低?谁说前端比后端薪资低?好了你又要说后端可以争取sp、ssp,但是能拿到美团白菜offer的就已经算是人中龙凤了,拿到sp、ssp更是凤毛麟角!依旧劝退后端!你后端学历内卷炼狱!实习经历卷的爆!甚至无法入行!入行了也只是和测开、前端的一般!1.学历,最痛的一击!后端工程师的第一步,走得不是技术,而是学历!想要进入大厂?好好看清楚自己的身份证:没有名校背景,别想着进美团、字节、腾讯! 面试官看你的第一眼就会想:“呵,去,给你点面试机会,看看你的技术!”什么?你说自己有技术?不好意思,来点GitHub链接,Project经历,能让面试官笑着赶你走。你没个985、211,双一流,根本就无法站稳在这场技术竞赛的起点。你想进大厂,没学历,没技术!永远只有一个词—— “被无情拒绝”。2. 薪资:你不过是和前端、测开的一匹马“后端工程师薪资高?能进SSP就是牛逼!”SSP? 听起来像是你梦想的银河,但实际上能拿到这个级别的人 凤毛麟角,除非你在面试官面前像神话人物一样打了个响指,否则你连SSP的尾巴都摸不着。至于你说的“前端薪资不高”?别逗了,前端都在笑你呢, 他们搞个页面,工资比你写个亿级请求接口还多。你说你辛辛苦苦优化API、调度缓存,别人搞个UI设计就能多拿几千块。前端已经不止是个展示层了,他们赚得比你还轻松,而你不过是服务器上疯狂跑“CRUD操作”的那只笨重的工蚁。3. 后端的真正意义:修 Bug,解决问题,下一份工作还是修 Bug有多少人觉得后端是系统架构、数据库优化的高端战场?醒醒吧! 后端的真正使命:维护旧项目,修复别人留下的烂摊子。你觉得自己能构建一个完美的系统?不!你只会一边修复技术债务,一边打着 “重构” 的旗号,换来的是 “重构再重构” 的无尽循环。而且,别告诉我你能专心写代码。你又要写代码,又要看服务器日志,没事还得帮别人 修崩的数据库,给前端数据源做“格式化”。你就是那块永远处于消耗型工作的 “万金油”。4. 晋升?哈哈哈,你是在做梦!你以为后端开发是一条顺风顺水的快速晋升路线?错! 你永远只能在一个“程序员”的岗位上打转,或者你为自己设立目标:“我要成为架构师”,那真的是在妄想。架构师?高级开发?靠近那条道路,你的心脏会先被晋升难度给捏住,你前方只有一座座高不可攀的技术山。别看那些SSP,架构师,架构啥呀?公司里的架构都是前端架构师,你就坐在后端的角落里,照顾着你那些满是错误的API和服务器。5. 加班?还是加班!你以为后端开发能像文艺片那样“偶尔加个班”?哈哈,傻了吧! 后端开发的生活是无休止的加班和修bug,你不仅要写接口,还得守夜调度、监控系统性能。就连你写的那个“完美的数据库查询”,也可能在 第二天 被前端因为“页面卡顿”给打回原形。“没有加班,你还能吃什么饭?”你说你是程序员,结果你的生活全是 熬夜加班、调试、重启。前端跑个页面,喝个咖啡就能过关,而你呢,熬夜跟数据库调试,最后还是那个穷忙的死循环。6. 技术天花板:架构?技术深度?笑死了!后端开发的天花板?那不过是个永远也摸不着的架构师“梦想”,你能掌握几款框架、几种数据库、两三套微服务架构,最后也不过是个 管理端的“搬运工”。你没办法“打破天花板”,更没有机会跳出“自己写个爬虫”或者“API接口”的死循环。技术深度?你也不过是 “技术债务”的修复者,一天到晚都在修补“老旧系统”的缺陷,偶尔听前端同学聊聊他们React、Vue的最新版本,你根本无法理解他们说的是什么。
开心小狗🐶:感觉后端有点像考研的0812,报名的时候都想冲0812,看不上0854。但是真入学了,不都是众生平等
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务