带环链表的环入口、环长度、链表总长

2023-11-07

1 判断链表是否带环

要先判断一个链表是否有环,最常用的方法是双指针法。
想象一下,如果两个人在环形赛道上跑步,那么不管他们之前的起点位置如何,跑得快的必将与跑得慢的相遇。在该题中,直接使用快慢指针,慢指针步长为1,快指针步长为2,如果出发后某一时刻快慢指针相遇,那么就说明链表带环。程序如下:

ListNode *detectCycle(ListNode *head) {
        ListNode *fast=head;
        ListNode *slow=head;  
        while(fast!=NULL&&fast->next!=NULL)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(slow==fast)break;
        }
        if(fast==NULL||fast->next==NULL)return false;
        return true;
    }

2 环的长度

快慢指针相遇后,假设相遇点为M,如果继续向前走,不难想到,下一次相遇点依然是M(画一个环试一下就知道了),而且第二次相遇时,快指针走过两圈,慢指针走过一圈,然后在M点相遇。因此,当快慢指针相遇后,二者继续往前走,当再次相遇时,慢指针走过的长度即是环的长度。

int  *lenOfCycle(ListNode *head) {
            ListNode *fast=head;  //快指针
            ListNode *slow=head; //慢指针   
            while(fast!=NULL&&fast->next!=NULL)
            {
                fast=fast->next->next;
                slow=slow->next;
                if(slow==fast)break;   //快慢指针相遇则退出,
            }
            if(fast==NULL||fast->next==NULL)return NULL;
            slow=slow->next;
            fast=fast->next;
            int len=1;
            while(slow!=fast)     //快慢指针继续往前走
            {
                slow=slow->next;
                fast=fast->next;
                len++;
            }
            return len;
        }

3 环的入口

如图所示。
在这里插入图片描述

假设链表起点为A,环入口为B,快慢指针在C处相遇,且从A到B距离为X,B到C距离为Y,环的长度为L,那么就有以下结论:

相遇时慢指针则走了X+Y,快指针走了2*(X+Y), 由于相遇,则有:2*(X+Y)-(X+Y)=K* L,其中K=1,2,3… 即
X+Y=K * L 变形可得: X=L-Y+(K-1)*L

这个式子就很重要了,表示什么意思呢?

这说明X的这段距离,就等于先走L-Y的距离,然后再走K-1次L的距离之和,而这里的L就是环的长度,因此,这个式子又可以看作是X的这段距离相当于先走了L-Y的距离,然后再绕环转了K-1圈。那么X和L-Y分别表示什么呢?看看图就明白了:X表示从A到B的距离,而L-Y刚好是从C到B的距离(图中逆时针),也就是说,一个人从A开始走,一个人从C开始沿逆时针走,那么从C开始走的这个人会经过绕环K-1圈后在B处与从A处触发的人相遇,而B点就是不仅是相遇点,还更是环的入口。

因此,找到环的入口的办法是:定义一个新的指针从链表起点开始走,同时前文中的慢指针从相遇点继续往前走,当新指针和慢指针相遇时,这个相遇点就是环的入口了。

代码如下:

ListNode *detectCycle(ListNode *head) {
        ListNode *fast=head;  //快指针
        ListNode *slow=head; //慢指针
        ListNode *slow2=head; //新指针
        while(fast!=NULL&&fast->next!=NULL)
        {
            fast=fast->next->next;
            slow=slow->next;
            if(slow==fast)break;   //快慢指针相遇则退出,
        }
        if(fast==NULL||fast->next==NULL)return NULL;
        while(slow!=slow2)     //新指针从起点出发,慢指针从相遇点出发
        {
            slow=slow->next;
            slow2=slow2->next;
        }
        return slow;
    }

4 链表总长

前面说了求环的长度和环的入口的方法,那么新指针从头到环的入口的长度再加上环的长度,结果自然就是链表总长了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带环链表的环入口、环长度、链表总长 的相关文章

随机推荐

  • Failed to convert property value of type ‘java.lang.String‘ to required type ‘java.util.Date‘

    spring boot的日期转换问题 前言 解决方法 原因 前言 小编的springboot项目已经配置了全局的日期转换 并且在项目中日期自动上添加了 JsonFormat pattern yyyy MM dd HH mm ss 的日期转换
  • python实现千牛客服自动回复语_千牛自动回复语大全

    千牛自动回复语大全 千牛自动回复语大全 对客户的疑问进行应答 1 亲 您真有眼光 这可是我们店主打产品哦 我能为您做些什么 您还有什么需要 不必客气 没关系 这是我们应该做的 我明白了 好的 是的 非常感谢 2 发什么快递啊 公司默认发的快
  • 如何正确高效准确的使用搜索引擎?

    ps 以下内容属于个人观点 如果侵犯了贵司 请责令删除 百度毫无疑问是国内最大的搜索引擎 而且其速度和稳定性也没得说 但是广告比较多 手机端的简单搜索没广告很不错 可惜电脑上用不了 就像现在的某名胜古迹已经变成了商业一条街一样 如今的搜索引
  • Java 堆栈问题排查流程

    1 通过top c命令查看那个进程CPU使用有异常 得到异常进程的pid 2 根据ps mp
  • spring的优点

    Spring优点 spring的优点主要体现在它的两大思想上 IOC DI和AOP中 IOC DI 控制反转 注入依赖 方便解耦 简化java的复杂开发过程 通过Spring提供的IOC容器 我们可以将对象之间的依赖关系交给Spring容器
  • 系统架构设计师(第二版)学习笔记----多媒体技术

    原文链接 系统架构设计师 第二版 学习笔记 多媒体技术 文章目录 一 多媒体概述 1 1 媒体的分类 1 2 多媒体的特征 1 3 多媒体系统的基本组成 二 多媒体系统的关键技术 2 1 多媒体系统的关键技术 2 2 视频技术的内容 2 3
  • idea remote debug

    一 介绍 Java远程调试的原理是两个JVM之间通过debug协议进行通信 然后以达到远程调试的目的 两者之间可以通过socket进行通信 二 步骤 1 修改配置文件 添加jvm 启动参数 Xrunjdwp 开启远程debug 端口 一般设
  • python数据可视化:编写程序,分别采用面向对象和面向函数两种方式绘制正弦曲线和余弦曲线

    编写程序 分别采用面向对象和面向函数两种方式绘制正弦曲线和余弦曲线 面向对象的方式 import numpy as np import matplotlib pyplot as plt x data np linspace np pi np
  • 粒子算法(PSO)优化支持向量机的数据分类预测,PSO-SVM分类预测,多输入单输出模型。

    清空环境变量 warning off 关闭报警信息 close all 关闭开启的图窗 clear 清空变量 clc 清空命令行 导入数据 res xlsread 数据集 xlsx 分析数据 num class length unique
  • Centos7开启SSH连接配置

    1 查看是否已安装openssh server root localhost yum list installed grep openssh server 如果有信息说明已安装了openssh server 如果输出没有任何结果 说明没有安
  • 【腾讯云 Cloud Studio 实战训练营】使用python爬虫和数据可视化对比“泸州老窖和五粮液4年内股票变化”

    Cloud Studio 简介 Cloud Studio是腾讯云发布的云端开发者工具 支持开发者利用Web IDE 集成开发环境 实现远程协作开发和应用部署 现在的Cloud Studio已经全面支持Java Spring Boot Pyt
  • 为虚拟机上的docker使用阿里云镜像地址

    一 获取镜像地址 登录阿里云网址 获取镜像地址 比如我的镜像地址是https q44tmizw mirror aliyuncs com 阿里云网址是https cr console aliyun com cn hangzhou instan
  • 关于Apache与 Tomcat的集群配置

    Apache Tomcat 集群配置 一 环境说明 Windows XP apache 2 0 59 win32 x86 no ssl msi http httpd apache org mod jk apache 2 0 59 so ht
  • MyBatis 深入浅出

    一 MyBatis 基础 1 什么是MyBatis mybatis是一个持久层框架 用java编写的 它封装了jdbc操作的很多细节 使开发者只需要关注sql语句本身 而无需关注注册驱动 创建连接等繁杂过程 它使用了ORM思想实现了结果集的
  • Practical Methodology(2)

    CONTENTS Selecting Hyperparameters Most deep learning algorithms come with many hyperparameters that control many aspect
  • 支付宝App支付源码

    支付宝APP支付 无论在文档上 还是在demo上 比微信支付高好几个level吧 使用起来非常方便 基本上不会有什么太大的坑 只要严格按照demo 和文档进行操作的话 基本上可以一把过的 在这里要提示下 加签和验签使用的公钥问题 加签是在开
  • 图和Neo4j

    文章来源 拉勾教育Java高薪训练营第3期 程道老师 1 图论 1 1 图论的起源 柯尼斯堡 Konigsberg 七桥问题 图论起源于一个非常经典的问题 柯尼斯堡 Konigsberg 七桥问题 1738 年 瑞典数 学家欧拉 Leorn
  • Tomcat 架构原理解析到设计借鉴

    关注 码哥字节 让你学会更多拆解 Tomcat 发展这么多年 已经比较成熟稳定 在如今 追新求快 的时代 Tomcat 作为 Java Web 开发必备的工具似乎变成了 熟悉的陌生人 难道说如今就没有必要深入学习它了么 学习它我们又有什么收
  • Python print()函数使用详解,Python打印输出

    作者主页 士别三日wyx 作者简介 CSDN top100 阿里云博客专家 华为云享专家 网络安全领域优质创作者 推荐专栏 对网络安全感兴趣的小伙伴可以关注专栏 网络安全入门到精通 print 可以 打印输出 常用来将内容 打印 到控制台
  • 带环链表的环入口、环长度、链表总长

    1 判断链表是否带环 要先判断一个链表是否有环 最常用的方法是双指针法 想象一下 如果两个人在环形赛道上跑步 那么不管他们之前的起点位置如何 跑得快的必将与跑得慢的相遇 在该题中 直接使用快慢指针 慢指针步长为1 快指针步长为2 如果出发后