【证明】快慢指针在带环链表中是否存在无法相遇的情形

2024-04-30 22:04

本文主要是介绍【证明】快慢指针在带环链表中是否存在无法相遇的情形,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

P. S.:以下代码均在VS2019环境下测试,不代表所有编译器均可通过。
P. S.:测试代码均未展示头文件stdio.h的声明,使用时请自行添加。

  

目录

  • 1. 前言
  • 2. 证明过程
    • 2.1 证明
    • 2.2 加证
  • 3. 结论
  • 4. 结语

1. 前言


  在了解本次内容前,可以先了解一下带环链表中使用快慢指针来判断链表是否带环的内容。

  链表带环问题之判断链表是否带环

在这里插入图片描述
  而本文我们探究的问题是快慢指针在带环链表中是否存在无法相遇的情形,在此背景下,我们的快慢指针之间的速度比可以不再是快指针走两步,慢指针走一步,而是可以将他们定位任意的步数,只要快指针走的比慢指针快即可。

  本问探究的情况是当快指针依次走三步,慢指针一次走一步的情形,此情形的道德结论同样适用于其他速率比(例如 3:5,2:5)。

  PS.下述证明过程中的速率比均为实际步数比,
  例如 3:1为FAST走三步,SLOW走一步。
  例如 4:3为FAST走四步,SLOW走三步。



2. 证明过程

2.1 证明


  
FASTSLOW
31

在这里插入图片描述
  在此处我们直接快进到SLOW到达入环点的时刻,此时FAST想要追到SLOW还需要追赶的距离为N。
  在上文中我们提到本次证明的情况为FAST : SLOW = 3 : 1。
  故每次移动FAST都会让其与SLOW的距离减少 2。
  如下表格体现:

当N为偶数时当N为奇数时
N - 2N - 2
N - 4N - 4
43
21
0(相遇)-1(第一次错过)

  我们发现当N为偶数时一定会相遇,当N为奇数时第一次FAST会与SLOW擦肩而过。
  此时我们再讨论第一次错过后的情形,假设环的一圈距离为C,当第一次错过时,FAST与SLOW在新一轮追逐过程中的距离为C - 1。

当C - 1为偶数时当C - 1为奇数时
C - 1 - 2C - 1 - 2
C - 1 - 4C - 1 - 4
43
21
0(相遇)-1(第二次错过)

  我们发现如果想让快慢指针在环中永远不会相遇,也就是FAST多指向的地址永远不会等于SLOW所指向的地址,那么就需要C - 1为奇数,且N也同时为奇数,此时我们使用反证法来证明快慢指针在带环链表中是否存在无法相遇的情形。

  假设C - 1 为奇数,那么C就为偶数,且同时N为奇数。

  而我们可以很轻松的得到,FAST在SLOW刚刚到达入环点时走过的路程为:

    3L = L + X * C + C - N
    通过简单的数学计算可以得到:
    2L = ( X + 1 ) * C - N

  令2L为A部分, ( X + 1 ) * C为B部分,N为C部分,显然A为偶数。

ABCB - C结果
偶数偶数奇数奇数等号不成立
偶数偶数偶数偶数等号成立
偶数奇数(此时要求C为奇数且X + 1为奇数)偶数奇数等号不成立
偶数奇数(此时要求C为奇数且X + 1为奇数)奇数偶数等号成立

  通过上表我们可以发现,当等号成立时不存在C为偶数,N为奇数的情形,故快慢指针在3 :1的速度比之下不存在永远无法相遇的情形。

2.2 加证

  为了证明更加严谨,我们加证一条FAST :SLOW = 4 :3的情形。

  我们可以得到,SLOW刚刚到达入环点时走过的路程为:
    3L

  FAST在SLOW刚刚到达入环点时走过的路程为:
    4L = 3L + X * C + C - N
    通过简单的数学计算可以得到:
    L = ( X + 1 ) * C - N

  FAST与SLOW的追赶路程为N

当N为偶数时当N为奇数时
N - 1N - 1
N - 2N - 2
22
11
0(相遇)0(相遇)

  故我们可以清楚的看到当FAST :SLOW = 4 :3 时,无论N为偶数还是N为奇数都一定会相遇。



3. 结论


  通过上文证明我们可以发现:
  当 FAST与SLOW速度差为偶数时,在等号成立的前提下,不同时存在C为偶数且N为奇数的情形,即当FAST与SLOW速度差为偶数时一定会相遇。
  当 FAST与SLOW速度差为奇数时,无论N为奇数还是偶数,都一定会相遇。
  故 不存在快慢指针在带环链表中无法相遇的情形,反证法得证。




4. 结语


  十分感谢您观看我的原创文章。
  本文主要用于个人学习和知识分享,学习路漫漫,如有错误,感谢指正。
  如需引用,注明地址。

这篇关于【证明】快慢指针在带环链表中是否存在无法相遇的情形的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/950033

相关文章

Idea实现接口的方法上无法添加@Override注解的解决方案

《Idea实现接口的方法上无法添加@Override注解的解决方案》文章介绍了在IDEA中实现接口方法时无法添加@Override注解的问题及其解决方法,主要步骤包括更改项目结构中的Languagel... 目录Idea实现接China编程口的方法上无法添加@javascriptOverride注解错误原因解决方

C#比较两个List集合内容是否相同的几种方法

《C#比较两个List集合内容是否相同的几种方法》本文详细介绍了在C#中比较两个List集合内容是否相同的方法,包括非自定义类和自定义类的元素比较,对于非自定义类,可以使用SequenceEqual、... 目录 一、非自定义类的元素比较1. 使用 SequenceEqual 方法(顺序和内容都相等)2.

查询Oracle数据库表是否被锁的实现方式

《查询Oracle数据库表是否被锁的实现方式》本文介绍了查询Oracle数据库表是否被锁的方法,包括查询锁表的会话、人员信息,根据object_id查询表名,以及根据会话ID查询和停止本地进程,同时,... 目录查询oracle数据库表是否被锁1、查询锁表的会话、人员等信息2、根据 object_id查询被

golang1.23版本之前 Timer Reset方法无法正确使用

《golang1.23版本之前TimerReset方法无法正确使用》在Go1.23之前,使用`time.Reset`函数时需要先调用`Stop`并明确从timer的channel中抽取出东西,以避... 目录golang1.23 之前 Reset ​到底有什么问题golang1.23 之前到底应该如何正确的

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

element-ui下拉输入框+resetFields无法回显的问题解决

《element-ui下拉输入框+resetFields无法回显的问题解决》本文主要介绍了在使用ElementUI的下拉输入框时,点击重置按钮后输入框无法回显数据的问题,具有一定的参考价值,感兴趣的... 目录描述原因问题重现解决方案方法一方法二总结描述第一次进入页面,不做任何操作,点击重置按钮,再进行下

python 字典d[k]中key不存在的解决方案

《python字典d[k]中key不存在的解决方案》本文主要介绍了在Python中处理字典键不存在时获取默认值的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,... 目录defaultdict:处理找不到的键的一个选择特殊方法__missing__有时候为了方便起见,

如何测试计算机的内存是否存在问题? 判断电脑内存故障的多种方法

《如何测试计算机的内存是否存在问题?判断电脑内存故障的多种方法》内存是电脑中非常重要的组件之一,如果内存出现故障,可能会导致电脑出现各种问题,如蓝屏、死机、程序崩溃等,如何判断内存是否出现故障呢?下... 如果你的电脑是崩溃、冻结还是不稳定,那么它的内存可能有问题。要进行检查,你可以使用Windows 11

Java子线程无法获取Attributes的解决方法(最新推荐)

《Java子线程无法获取Attributes的解决方法(最新推荐)》在Java多线程编程中,子线程无法直接获取主线程设置的Attributes是一个常见问题,本文探讨了这一问题的原因,并提供了两种解决... 目录一、问题原因二、解决方案1. 直接传递数据2. 使用ThreadLocal(适用于线程独立数据)