链表带环问题的方法证明

目录

一、带环问题的解决

1、固定思路

2、思路后的数学证明

3、不相遇的情况分析 

二、环入口问题

​编辑

1、固定思路 

2、数学证明

三、求环的长度


一、带环问题的解决

1、固定思路

链表带环问题比较传统的思路是使用快慢指针,当快和慢指针相遇的时候那么说明此链表带环

所以我们可以很容易写出下面的代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
bool hasCycle(struct ListNode *head) 
{   struct ListNode*slow=head;
    struct ListNode*fast=head;
    while(fast!=NULL&&fast->next!=NULL)
    {
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow)
        {
            return true;
        }
    }
    return false;
}

那么这个是为什么,难道是偶然吗?其实不然。

2、思路后的数学证明

由上面可知道当fast==2slow的时候一定相遇,那么当fast!=2slow呢,一定会相遇吗?,有没有可能出现不相遇的情况?

3、不相遇的情况分析 

同样的道理我们还是画图来解释:

理论上来说是存在追不上的情况的,对不对呢?我们通过数学来证明一下:
 证明后发现上面的情况可以相遇:
那么当fast==任意倍的slow时都是可以的,只不过证明起来比较麻烦,举一个4倍的例子

二、环入口问题

1、固定思路 

这个问题也时固定思路设定一个meet指针为fast和slow相遇的地方,newhead为头两个同时向后走当两者相遇时为入口:
 

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode *detectCycle(struct ListNode *head) 
{
    struct ListNode*slow=head;
    struct ListNode*fast=head;
    struct ListNode*newhead=head;
    struct ListNode*meet=head;
    while(1)
    {
        if(fast==NULL||fast->next==NULL)
        {
            return NULL;
        }
        fast=fast->next->next;
        slow=slow->next;
        if(fast==slow)
        {
            meet=slow;
            break;
        }
    }
    while(newhead!=meet)
    {
        meet=meet->next;
        newhead=newhead->next;
    }
    return meet;
}

2、数学证明

所以上述办法是正确的不是偶然:

三、求环的长度

上述办法求出环的入口,从入口开始走走到再次走到入口时走过的距离就是环长

struct ListNode *cur = meet->next;//避免进不去循环
int count = 0;
while(cur!=meet)
{
    cur = cur->next;
    count++;
}
count++;//少加了一次

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

工具篇--Window--常用工具命令汇总(持续更新)

文章目录 前言一、常用工具:1.1 window host 修改:1.2 window 端口占用:1.3 打开/关闭防火墙:1.4 JavaScript 对象或值转换为 JSON 字符串: 二、命令行:2.1 获取本机ip: 三、网页在线工具:3.1 本…

吴恩达深度学习笔记:深度学习的 实践层面 (Practical aspects of Deep Learning)1.9-1.10

目录 第一门课:第二门课 改善深层神经网络:超参数调试、正 则 化 以 及 优 化 (Improving Deep Neural Networks:Hyperparameter tuning, Regularization and Optimization)第一周:深度学习的 实践层面 (Practical aspects of Deep Learning)…

LabVIEW自动剪板机控制系统

LabVIEW自动剪板机控制系统 随着工业自动化的快速发展,钣金加工行业面临着生产效率和加工精度的双重挑战。传统的手动或脚踏式剪板机已无法满足现代生产的高效率和高精度要求,因此,自动剪板机控制系统的研究与开发成为了行业发展的必然趋势。…

如何快速开发个性化回收小程序

回收小程序的开发无疑是提升回收业务效率的重要途径。它不仅可以清晰地列出各类回收物品,还能在微信、抖音、支付宝等多个平台同时上线,让回收服务触手可及。那么,如何以最快、最简单、最经济的方式上线这样一个小程序呢? 在这里&…

Linux实训-用户和组的管理

实训1:用户的管理 创建一个新用户user1,设置其主目录为/home/user1。查看/etc/passwd文件的最后一行,看看是如何记录的。查看文件/etc/shadow文件的最后一行,看看如何记录的。给用户user1设置密码。再次查看文件/etc/shadow文件的…

分享5个图源二维码及使用方法

数据是GIS的血液! 我们在《4个在ArcGIS中可加载的图源分享》一文中,为大家分享了4个可以直接在ArcMap中打开查看的图源。 现在,我们再分享5个可以在水经微图(以下简称“微图”)桌面版(PC端)、…

Kafka Exactly Once 语义实现原理:幂等性与事务消息

01 前言 在现代分布式系统中,确保数据处理的准确性和一致性是至关重要的。Apache Kafka,作为一个广泛使用的流处理平台,提供了强大的消息队列和流处理功能。随着业务需求的增长,Kafka 的事务消息功能应运而生,它允许应…

MacPro(M1,M2芯片)Java开发和常用工具开源软件合集

目录 Java开发软件1 IDE1.1 idea1.2 Vs Code 2 开发工具2.1 数据库数据库模型管理数据库连接客户端 2.2 SSH/Telnet/Serial/Shell/Sftp客户端2.3 MarkDown编辑器2.3 代码片段管理粘贴 3小工具3.1 截图贴图3.2 Mac下修改hosts文件的图形化界面软件 Java开发软件 1 IDE 1.1 ide…

第三方软件测试机构-科技成果评价测试

科技成果评价测试是对科研成果的工作质量、学术水平、实际应用和成熟程度等方面进行的客观、具体、恰当的评价过程。这一评价过程有助于了解科技成果的质量和水平,以及其在学术和应用方面的价值和潜力。 科技成果评价测试主要包括以下几个方面: 工作质量…

设计不外流,保护创意的同时锁住图纸安全!

在设计行业中,图纸和创意文稿的安全至关重要,因为它们体现了企业的创新能力和核心竞争力。华企盾DSC数据防泄密系统提供了一系列功能,可以有效地保护这些珍贵的设计和文档不被外泄。以下是如何利用华企盾DSC系统保障设计图纸安全的关键措施&a…

tableau如何传参数到MySQL数据库

1、打开tableau连接本地MySQL-》新建自定义sql-》创建参数 2、新建一个简单的工作表-》把维度拖拽到行显示结果-》右键显示参数 3、参数传递到数据库sql写法 select * from yonghu where yonghu.姓名 like concat(%,<参数.姓名>,%)select * FROMabadata4WHERE abadata4…

mysql-sql-练习题-1

文章目录 环境注释建表 5张建库学生表课程表教师表分数表总表 语法书写顺序in学过/没学过完全相同 环境 Windows cmd&#xff08;普通用户/管理员&#xff09; mysql -uroot -pmysql版本&#xff0c;模式&#xff08;可自定义&#xff09; select version(),global.sql_mode…

不完全微分PD控制器(CODESYS源代码+算法详细介绍)

完全微分计算公式为Kp*Td/Ts(e(k)-e(k-1))。有关位置式PID和增量式PID更多相关内容,大家可以参考下面的文章链接: 1、CODESYS位置式PID CODESYS位置式PID(完整ST源代码)_codesys pid功能块-CSDN博客文章浏览阅读1.1k次,点赞2次,收藏2次。CODESYS增量式PID完整源代码请参看…

中国标准地图如何与卫星影像叠加

我们在《一幅SHP格式的中国标准地图》一文中&#xff0c;为你分享过一幅SHP格式的中国标准地图&#xff0c;但该数据为等积投影。 由于我们常用的卫星影像为WGS84经纬度投影或墨卡托投影&#xff0c;那么将该数据如何与卫星影像进行叠加制作专题图呢&#xff1f; 我们现在就来…

day17-day20_项目实战项目部署

万信金融 项目部署 目标&#xff1a; 理解DevOps概念 能够使用Docker Compose部署项目 理解持续集成的作用 会使用Jenkins进行持续集成 1 DevOps介绍 1.1 什么是DevOps DevOps是Development和Operations两个词的缩写&#xff0c;引用百度百科的定义&#xff1a; DevOps…

Windows Server配置网卡绑定:NIC组合

正文共&#xff1a;1024 字 12 图&#xff0c;预估阅读时间&#xff1a;1 分钟 在网络设备上&#xff0c;为了提高可靠性&#xff0c;一般会配置链路聚合&#xff08;Link Aggregation&#xff09;&#xff08;网络之路28&#xff1a;二层链路聚合&#xff09;&#xff0c;同样…

GNU Radio之OFDM Channel Estimation底层C++实现

文章目录 前言一、 OFDM Channel Estimation 模块简介二、C 具体实现1、初始化和配置参数2、forecast 函数3、计算载波偏移量4、提取信道响应5、核心的数据处理任务 前言 OFDM Channel Estimation 模块的功能是根据前导码&#xff08;同步字&#xff09;估计 OFDM 的信道和粗略…

FileLink内外网文件摆渡系统产品介绍

在现代企业中&#xff0c;往往存在着多个网络、系统之间的数据孤岛问题&#xff0c;数据难以互相访问和共享。 一、常用的内外网文件摆渡方式 传统的数据交换方式往往需要人工介入&#xff0c;效率低下且容易出错。如&#xff1a;U盘、FTP、VPN等&#xff0c;极易引发各种各样…

CSS常见的 9 个单位汇总!

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合…

银行卡归属地查询API接口快速对接

银行卡归属地查询API接口指的是通过银行卡号查询该银行卡详细信息&#xff0c;包括银行卡名称、卡种、卡品牌、发卡行、编号以及归属地等信息&#xff0c;支持一千多家银行返回归属地信息&#xff0c;那么银行卡归属地查询API接口如何快速对接呢&#xff1f; 首先找到有做银行…
最新文章