怎么判断一个链表是否成环?怎么找到成环的起点

news2024/11/18 3:39:38

问题引入

给定一个单向链表,怎么判断这个链表是否成环?如果这个链表是环形的,找到这个环形的起点。

@Getter
@Setter
public class ListNode {

    public Integer val;

    public ListNode next;

    public ListNode(Integer val) {

        this.val = val;
    }

    public ListNode(Integer val, ListNode next) {
        this.val = val;
        this.next = next;
    }

    public ListNode() {
    }
}

判断是否成环 

比如,下面这个就是一个典型的单向环形链表

可以想象一下,大学里面的长跑比赛,赛道是环形的,那些跑的快的同学往往会领先跑的最慢的同学,随着时间的推移,他会在某个位置,领先一圈追上最慢的同学,如果长跑距离足够长,最快的同学还会第二次、第三次超越最慢的同学。

受此启发,我们是不是可以模拟两个遍历速度不同的指针来解决此问题,答案是可行的。比较官方的说法是快慢指针。

原理也很简单,快指针一次走两步,慢指针一次走一步,如果快指针最终和慢指针相遇了,说明这个链表是成环的,相反,快指针直接遍历到了终点【下一个节点为null】还没有相遇,说明此链表不是环形的。

直接看代码吧

public static boolean hasCycle(ListNode head) {
        ListNode fast = head, slow = head;
        while (fast != null && fast.next != null) {
            fast = fast.next.next;
            slow = slow.next;
            //快指针追上了慢指针
            if (fast == slow) {
                return true;
            }
        }

        return false;

    }

找到环的起点

对于这个问题,我们需要先推演一下

假设快慢指针在如图中的红色点处第一次相遇,那么 是不是可以认为快指针比慢指针多走了一圈。假设从环的起点到红色点处的链表长度是m,假设慢指针一共走了k步,那么快指针一共则走了2k步,根据上面的推演可以看出

相遇点距离环的起点是k-m步,和链表的起点到环的起点处的距离是一样的,假如在快慢指针第一次相遇的时候,慢指针返回至链表的起点,同时快指针的速度降为和慢指针一样,那么他们下一次相遇点一定是在环的起点。

对应的程序代码如下

    public static ListNode detectCycle(ListNode head) {
        ListNode fast, slow;
        fast = slow = head;
        while (fast != null && fast.next != null) {
            //快指针走两步
            fast = fast.next.next;
            //满指针走一步
            slow = slow.next;
            if (fast == slow) {
                break;
            }
        }

        if (fast == null || fast.next == null) {
            //没有成环
            return null;
        }

        //慢指针回到链表的头部
        slow = head;
        while (slow != fast) {
            //快慢指针步调一致
            slow = slow.next;
            fast = fast.next;
        }

        return slow;
    }

有没有觉得很神奇,解决问题的思路就来源于生活,道存天地间!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1423186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习第十四天

1.结构体(2): (1)结构体类型定义 (2)结构体变量的定义 (3)结构体元素的访问 (4)结构体的存储: 内存对齐: char 按照1字节对齐 …

DDD学习使用

简介 DDD(Domain-Driven Design):领域驱动设计。 Eric Evans “领域驱动设计之父” DDD不是架构,而是一种方法论(Methodology)微服务架构从一出来就没有很好的理论支撑如何合理的划分服务边界,人们常常为服务要划分多…

java面向对象基础(面试)

一、面向对象基础 1. 面向对象和面向过程的区别 面向过程把解决问题的过程拆成一个个方法,通过一个个方法的执行解决问题。面向对象会先抽象出对象,然后用对象执行方法的方式解决问题。 2.创建一个对象用什么运算符?对象实体与对象引用有何不同? n…

坚持刷题 | 完全二叉树的节点个数

Hello,大家好,我是阿月!坚持刷题,老年痴呆追不上我,今天刷:完全二叉树的节点个数 题目 222.完全二叉树的节点个数 代码实现 class TreeNode {int val;TreeNode left, right;public TreeNode(int val) …

1990-2021年各省绿色金融指数数据(含原始数据+测算结果)

1990-2021年全国各省绿色金融指数数据(含原始数据结果) 1、时间:1990-2021年 2、指标:地区、年份、该省环保项目信贷总额(亿元)、全省信贷总额(亿元)、绿色信贷、环境污染治理投资…

记录 arm 开发板上 nginx 配置 http 服务注意事项

1. 自定义项目,需要在 conf.d 目录中增加一个 .conf 配置文件: server {listen 9200; # 端口号server_name localhost; # 服务名称location / {root /home/imx6q/media; # 项目根目录(需要修改 n…

41、WEB攻防——通用漏洞XMLXXE无回显DTD实体伪协议代码审计

文章目录 XXE原理&探针&利用XXE读取文件XXE带外测试XXE实体引用XXE挖掘XXE修复 参考资料:CTF XXE XXE原理&探针&利用 XXE用到的重点知识是XML,XML被设计为传输和存储数据,XML文档结构包括XML声明、DTD文档类型定义&#xf…

Elasticsearch Windows版安装配置

Elasticsearch简介 Elasticsearch是一个开源的搜索文献的引擎,大概含义就是你通过Rest请求告诉它关键字,他给你返回对应的内容,就这么简单。 Elasticsearch封装了Lucene,Lucene是apache软件基金会一个开放源代码的全文检索引擎工…

OpenAI API 的最新动态:新一代的嵌入模型,更新 GPT-4 Turbo,更新 GPT-3.5 Turbo 以及降低 API 价格

文章目录 一、前言二、主要内容三、总结 🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 正在推出新一代嵌入模型、新的 GPT-4 Turbo 和审查模型、新的 API 使用管理工具,而且很快就会降低 GPT-3.5 Turbo 的价格。 OpenAI…

latex中的一些小要点

表格 1.生成双直线表格 \begin{tabular}{| l | l |}⬇ ⬇ ⬇ ⬇ ⬇ ⬇\begin{tabular}{| l || l |}\hline ⬇ ⬇ ⬇\hline \hline →

Java基于SpringBoot+Vue的电影影城管理系统,附源码,文档

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【PyQt】04-Designer

文章目录 前言一、初级 Designer1.1 拖拽设计界面1.2 搞定之后记得保存ui文件1.3 载入代码1.4 运行结果 二、登入界面代码效果展示账号密码错误时账号和密码正确 总结 前言 自然还是跟着王铭东老师学的 一、初级 Designer 1.1 拖拽设计界面 进度条是这个 1.2 搞定之后记得保…

布局技巧及CSS初始化

一,margin负值巧妙应用 二,文字围绕浮动元素 三,行内块 四,CSS三角强化 五,CSS初始化 一,margin负值巧妙应用 制作盒子的细线边框: 鼠标经过li后变色: 二,文字围绕…

3D 转换

1,3D的特点: 近小远大 物体后面遮挡不可见 2,3D移动 translate3d 3D移动在2D移动的基础上多加了一个可以移动的方向,就是z轴方向 transform:translateX(100px):仅仅是在x轴上移动…

Redis冲冲冲——缓存三兄弟:缓存击穿、穿透、雪崩

目录 引出缓存击穿缓存穿透缓存雪崩 总结 引出 谈谈redis的击穿、穿透、雪崩。 缓存击穿 缓存击穿:redis中没有,但是数据库有 顺序:先查缓存,判断缓存是否存在;如果缓存存在,直接返回数据;如果…

考研高数(共轭根式)

1.定义 共轭根式:是指两个不等于零的根式A、B,若它们的积AB不含根式,则称A、B互为共轭根式。 共轭根式的一个显著特点是通过相乘能把根号去掉,这是很有帮助的 2.常用的共轭根式 3.例题 1)求极限 2)证明…

第九节HarmonyOS 常用基础组件21-ImageAnimator

1、描述 提供帧动画组件来实现逐帧播放图片的能力&#xff0c;可以配置需要播放的图片列表&#xff0c;每张图片可以配置时长。 2、接口 ImageAnimator() 3、属性 参数名 参数类型 描述 images Array<ImageFrameInfo> 设置图片帧信息集合&#xff0c;每一帧的帧…

#pycharm|插件#pycharm提高生产力的工具,自用顺手,推荐一波

aiXcoder Code Completer aiXcoder 结合上下文为用户生成完整且更符合实际场景的代码行或者代码块&#xff0c;同时提供生成代码、自动生成单元测试、Bug自动修复、代码解释、生成注释等功能。 CodeGeeX 代码极X CodeGeeX是一款基于LLMs的强大智能编程助手。提供代码生成/补全…

bluecms 代码审计

一 环境准备 BlueCMS v1.6 sp1 phpstudy php5.6.9apachemysql 二 环境搭建 phpstudy 1.把下好的BlueCMS源码文件bluecms_src放到phpStudy的WWW目录下 2.访问本地&#xff1a;http://localhost/bluecms_src/&#xff0c; 能看到项目文件 3.访问地址&#xff1a;http://loca…

解决:ModuleNotFoundError: No module named ‘tiktoken’

解决&#xff1a;ModuleNotFoundError: No module named ‘tiktoken’ 文章目录 解决&#xff1a;ModuleNotFoundError: No module named tiktoken背景报错问题报错翻译报错位置代码报错原因解决方法方法一&#xff0c;直接安装方法二&#xff0c;手动下载安装方法三&#xff0…