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

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.hqwc.cn/news/660284.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

牛客热题:判断链表是否有环

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:判断链表是否有环题目链接方法一…

ansible-playbook离线升级centos内核

目录 概述实践ansible目录结构关键代码执行效果 结束 概述 内核离线包官网下载地址如下: 地址 实践 ansible目录结构 如对 ansible 不熟悉,离线包下载有问题,请至此地址下载,按本文操作可直接使用。 相关文章链接如下 文章地…

普乐蛙元宇宙VR体验馆设备集体亮相VR文旅景区展

普乐蛙全国巡展又双叒叕开始了! 这次来到的是“好客山东”↓↓ 山东2024休闲旅游产业展 4月25日至27日,2024休闲旅游产业展在临沂国际博览中心举办。本次展会以“潮购文旅好品,乐享时尚生活”为主题,汇聚全国文旅产业上下游500多家企业、上万…

深度学习系列66:试穿模型IDM-VTON上手

1. 模型概述 如图,总体流程为: 输入为:衣服的编码xg;人物noise的编码xt;人物身上衣物的mask和人体pose分割(densepose);衣服部分经过两部分网络:1)高级语义网络IP-Adapter&#xff…

anything-llm的嵌入式聊天小部件

anything-llm 详情移步到官方: https://github.com/Mintplex-Labs/anything-llm anything-llm可以docker启动和本地启动 例如:docker 启动, 自行去安装docker哈 cd 到docker文件夹下, 窗口运行: docker-compose up -d --build运…

简要说说软分叉和硬分叉。

前言 一、软分叉 二、硬分叉 三、用途 总结 前言 软分叉和硬分叉是区块链技术中的两个重要概念,它们通常与加密货币的网络升级有关。下面我将分别解释这两个概念,并提供一些例子来帮助理解。下面是方便理解软分叉和硬分叉的图 一、软分叉 软分叉是一…

有没有永久免费的仓库出入库管理软件

作为相关行业的从业者,很多中小企业希望能节省成本,或者没有付费使用管理系统的习惯,所以想要找到一款永久免费的仓库出入库管理软件。但我还是不大建议大家选择所谓的免费仓库管理软件。为什么呢?请往下看 很多时候免费的才是最…

渗透测试之sql注入绕过技巧

在sql注入中,通常会将某些关键的字符过滤掉,以此来达到预防sql注入的目的。这时我们就可以通过某些技巧来绕过。 绕过技巧1: 这个是在某个比赛中出现的,当时并没有多少人成功绕过。 如下: 如下图:在php中…

无影云电脑如何进行硬盘镜像迁移

问题的由来 看过我的博文的朋友都知道,我从一月来一直在使用阿里的无影云电脑来测试各种开发板。试用的效果一直不错,3个月的试用期到了,就想买一年的服务用用。不过试用的电脑并不能直接购买,必须先购买一台新的云电脑&#xff…

Dockerfile加docker-compose构建编排web应用

Dockerfile加docker-compose构建编排web应用 用flask框架写一个web服务器应用,使用Dockerfile构建镜像,然后用docker-compose编排启动应用。 1. 创建一个简单的flask应用 创建flask-app目录,在目录下创建一个名为 app.py 的文件,并…

23 重构:烟囱式、平台化、中台化的架构

上一讲里,我们介绍了两大类型的系统升级重构方案,还介绍了如何进行重构版本的上线,以及如何平滑地完成新老版本切换的方案。在本讲里,将会具体介绍如何判断系统发展到什么阶段需要重构,以及如何实施重构。 系统稳定性…

C语言实战项目--贪吃蛇

贪吃蛇是久负盛名的游戏之一,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。在编程语⾔的教学中,我们以贪吃蛇为例,从设计到代码实现来提升大家的编程能⼒和逻辑能⼒。 在本篇讲解中,我们会看到很多陌生的知识&…