Floyd判圈算法——环形链表(C++)

news2024/10/6 3:24:39

        Floyd判圈算法(Floyd Cycle Detection Algorithm),又称龟兔赛跑算法(Tortoise and Hare Algorithm),是一个可以在有限状态机、迭代函数或者链表上判断是否存在环,求出该环的起点长度的算法。                                                                               ——摘自百度百科

算法讲解

场景设想①

        在一个存在环形的跑道上,直行跑道的距离为m,环形跑道的距离为n,乌龟(Tortoise)和兔子(Rabbit)均在跑道的起点准备赛跑,兔子的速度是乌龟的两倍,那么经过一段时间 以后(假设动物进入环形跑道后不会出环),兔子将与乌龟在k点相遇,相遇时兔子比乌龟多跑a个环形跑道的距离。

由于兔子的速度是乌龟的两倍,那么兔子所走的距离就是乌龟的两倍,列出表达式如下: 

可以得到:乌龟所走的距离也是环形跑道距离的整数倍!

问题:根据上面的条件如何才能得到环形跑道的入口点呢?

场景设想②

        已知乌龟和兔子将在k点相遇,下面分别将乌龟置于直行跑道起点兔子置于环形跑道相遇点k,同时将乌龟和兔子置为同速,然后运动。

        当乌龟走了m距离之后,兔子同样走了m距离,由于m+k又是环形跑道的整数倍,那么兔子经过m距离之后就会回到环形跑道的入口,此时乌龟也到达了环形跑道的入口,因此兔子和乌龟就一定在环形跑道的入口点发生相遇,至此入口点就找到了。

算法实现

算法思路

1. 寻找相遇点k;

        定义Slow和Fast指针,在初始时刻分别指向跑道起点,在循环过程中Slow指针每次往前移动一步,Fast指针每次往前移动两步,直到两者相遇时退出循环;

2. 寻找环形跑道入口点;

        将Slow指针指向跑道起点,Fast指针指向相遇点k,在循环过程中Slow和Fast指针每次都往前移动一步,直到Slow == Fast,两者相遇时停止,此时的相遇点就是环形跑道的起点。

代码实现

        141. 环形链表 - 力扣(LeetCode)为例:

题目描述

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

如果链表中存在环,则返回 true 。 否则,返回 false 。

示例 1:

输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。
class Solution {
public:
    bool hasCycle(ListNode *head) {
        if(head == nullptr || head->next == nullptr){
            return false;
        }
        ListNode *slow = head, *fast = head;
        do{
            slow = slow->next;
            fast = fast->next->next;
            if(fast == nullptr || fast->next == nullptr){
                return false;
            }
        }while(slow != fast);
        return true;
    }
};

执行结果

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

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

相关文章

Java语言程序设计篇一

Java语言概述 Java语言起源编程语言最新排名名字起源Java语言发展历程Java语言的特点Java虚拟机垃圾回收Java语言规范Java技术简介Java程序的结构Java程序注意事项:注释编程风格练习 Java语言起源 1990年Sun公司提出一项绿色计划。1992年语言开发成功最初取名为Oak…

vue3使用方式汇总

1、引入iconfont阿里图库图标: 1.1 进入阿里图标网站: iconfont阿里:https://www.iconfont.cn/ 1.2 添加图标: 1.3 下载代码: 1.4 在vue3中配置代码: 将其代码复制到src/assets/fonts/目录下&#xff1…

大众点评2024年全球必吃榜清单

大众点评2024年全球必吃榜清单共2797家,奇怪的是官方并没有发布详细清单,只发布了新闻通稿介绍大概情况。这里做一些整理。 按城市分布情况,数量如下 上海 144 北京 137 成都 96 重庆 93 广州 81 深圳 79 武汉 69 苏州 67 杭州 61 …

应急响应--网站(web)入侵篡改指南

免责声明:本文... 目录 被入侵常见现象: 首要任务: 分析思路: 演示案例: IIS&.NET-注入-基于时间配合日志分析 Apache&PHP-漏洞-基于漏洞配合日志分析 Tomcat&JSP-弱口令-基于后门配合日志分析 (推荐) Webshell 查杀-常规后门&…

17_VGG深度学习图像分类算法

1.1 简介 VGG网络,全称为Visual Geometry Group网络,是由牛津大学的Visual Geometry Group和谷歌DeepMind的研究人员共同提出的深度卷积神经网络模型。这一模型因在2014年ILSVRC(ImageNet大规模视觉识别挑战赛)中取得图像分类任务…

昇思25天学习打卡营第4天|MindSpore数据集和数据变换

# 打卡 目录 # 打卡 Dateset:Pipeline 的起始 具体步骤 数据处理 Pipeline 代码例子 内置数据集的情况 自定义数据集的情况 可迭代的数据集 生成器 Transforms:数据预处理 代码例子 通用变换Compose 文本变换 Text Lambda变换 Dateset&…

STM32芯片系列与产品后缀解读

一. 产品系列 STM32单片机是一系列基于ARM Cortex-M内核的32位微控制器,广泛应用于嵌入式系统中。 STM32系列由STMicroelectronics(意法半导体)开发和生产,并凭借其灵活的设计、丰富的外设和强大的生态系统,成为嵌入式…

JVM专题之G1垃圾收集器下

索引(记录)的源码的工作流程图如下: CSet(Collection Set 回收集合) 收集集合(CSet)代表每次GC暂停时回收的一系列目标分区。在任意一次收集暂停中,CSet所有分区都会被释放,内部存活的对象都会被转移到分配的空闲分区中。因此无论是年轻代收集,还是混合收集,工作的机…

catia数控加工仿真铣平面粗加工

1,零件建模,毛坯建模 2 在毛坯上建立坐标系 3 添加资料刀具 4,双击对相关加工信息做设置 5 Roughing 加工设置 高亮红色区域是必选的,其他可以默认 6 完成加工仿真 7 加工余量

IntelliJ IDEA 同时多行同时编辑操作快捷键

首先 点击要编辑的地方,长按鼠标左键不放,同时按住 Ctrl Shift Alt,然后就可以进行多行编辑了

亲密数对C++函数

自定义函数 #include<bits/stdc.h> using namespace std; //求n的因子和自定义函数 int yinzihe(int n){//使用2~sqrt(n)成对求解因子和int r0,i;//变量 r 初始值为0&#xff0c;因为要存放因子和for(i2;i<sqrt(n);i) {//回顾sqrt()课程//如果 i 是 n 的因子&#xf…

用win的控制台去远程连接虚拟机linux的终端

以Ubuntu为例&#xff0c;首先确保Ubuntu已经安装了ssh服务 sudo apt-get install openssh-server输入密码 安装完毕后查看ssh状态是否开启 sudo systemctl status ssh 显示绿色激活状态&#xff0c;可以关闭或开启 对应start和stop winr打开win端控制台 输入 ssh -p 22 …

【Linux详解】进程等待 | 非阻塞轮询

引入&#xff1a; 为什么&#xff1f;是什么&#xff1f;怎么办 是什么&#xff1f; 进程等待是指父进程暂停自己的执行&#xff0c;直到某个特定的子进程结束或发生某些特定的事件。 为什么&#xff1f; 僵尸进程刀枪不入&#xff0c;不可被杀死&#xff0c;存在内存泄露…

Codeforces Round 918 (Div. 4)(A~F)

目录 A. Odd One Out B. Not Quite Latin Square C. Can I Square? D. Unnatural Language Processing E. Romantic Glasses F. Greetings A. Odd One Out Problem - A - Codeforces 输出一个不同于其他两个数的数&#xff0c;用异或操作可以轻松解决。 void solve{int…

ompl.app的demo_OpenDEPlanning例子

编译了下OMPL和OMPL.app, 其中有个example 是用刚体动力学库ODE搭建的小车运动场景&#xff0c;找出小车到目标的路径&#xff0c;牵引小车跑到目标位置。 ompl小车路径运动模拟

https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件

文章目录 前言https 自签证书相关生成csr文件、p12文件、crt文件、jks文件、key文件、pem文件1, 检查openssl的版本2. 生成私钥和证书签署请求 (CSR)3. 生成自签名证书4. 将证书和私钥转换为 PKCS12 格式的密钥库5. 创建信任库 (Truststore)6. 将 PKCS12 文件转换为 JKS 文件7.…

详解Python递归解决汉诺塔问题

Python递归解决汉诺塔问题 递归解决汉诺塔问题是经典的计算机科学问题&#xff0c;它涉及到如何将一堆盘子从一个柱子上移动到另一个柱子上&#xff0c;每次只能移动一个盘子&#xff0c;并且大盘子不能放在小盘子上面。 例如我们需要将a柱盘子全部移动到b柱&#xff0c;接下来…

程序员熬夜看欧洲杯被“冻住”,呼吸困难……

2024欧洲杯接近尾声&#xff0c;更是激发球迷兴趣。由于时差关系&#xff0c;很多球迷熬夜看球&#xff0c;啤酒、宵夜成了标配。然而&#xff0c;在这份欢乐背后&#xff0c;也隐藏着健康风险。 日前&#xff0c;浙江杭州29岁的程序员单先生熬夜与朋友看完球赛后开车回家&…

室内定位可视化:精准导航与实时位置展示

通过图扑室内定位可视化技术&#xff0c;提供精准的导航服务和实时位置展示&#xff0c;帮助用户高效找到目标地点&#xff0c;提升空间管理和资源配置的效率与体验。

Spring学习05-[AOP学习-AOP原理和事务]

AOP原理和事务 AOPAOP底层原理比如下面的代码案例手动模拟AOP 动态代理详解JDK动态代理 AOP AOP底层原理 当实现了AOP,Spring会根据当前的bean创建动态代理(运行时生成一个代理类) 面试题&#xff1a;为什么执行方法的时候&#xff0c;会执行切面里的通知方法&#xff1f; 比…