[C/C++]数据结构 深入挖掘环形链表问题

前言

        在上一篇文章中讲述了如何判断链表是否带环,在观看本片文章时建议先了解一下这篇文章的内容[C/C++]数据结构 链表OJ题:环形链表。本篇文章我们将讲述关于环形链表的几种不同的情况如下,同时我们要解决另一个环形链表问题----找到入环点

  1. slow一次走一步fast一次走两步一定会相遇吗?
  2. slow一次走一步fast一次走三部一定会相遇吗?
  3. slow一次走n步fast一次走m步一定会相遇吗? (m>n>1)

情况分析:

1.slow一次走一步fast一次走两步一定会相遇吗?

        这个问题在上一篇文章中我们也讲过,若slow指针已经入环,每走一步fast与slow之间的距离就会减一,减为0时两指针相遇

2.slow一次走一步fast一次走三部一定会相遇吗?

        假设slow入环时,fast和slow之间距离为N

之后每走一步,fast和slow之间的距离就会减小2,这里就需要讨论N的取值了

  • 当N为偶数, 距离变化: N -> N-2 -> N-4.......->2 -> 0 ,两指针距离一次减小2,一定会相遇
  • 当N为奇数, 距离变化: N -> N-2 -> N-4.......->1 -> -1

        距离变为-1就说明fast在走三步的时候跳过了slow,又跑到了slow的前面,第一轮追逐没有相遇,此时又要开时第二轮追逐,假设环的周长为c,开始第二轮追逐时fast与slow之间的距离为c-1

此时有需要讨论c的取值

  • 当c为奇数,c-1为偶数,两指针一定会相遇
  • 当c为偶数,c-1为奇数,slow与fast就又不会相遇,同理这种情况无论第几次追逐两指针都不会相遇

总结:

  1. 如果N为偶数,两指针在第一轮追逐就会相遇
  2. 如果N为奇数,c为奇数,第一轮两指针会错过,但是在第二轮会相遇
  3. 如果N为奇数,为偶数,则两指针永远不会相遇

问题来了: 如果N为奇数,为偶数,则两指针永远不会相遇,但是这个条件成立吗?如何验证

slow入环时:

慢指针走的路程: L

快指针走的路程: n*c - N  (n代表走了n圈)

快指针所走路程为慢指针所走路程的三倍,可得:

3L = L+ n*c - N 即 2L = n*c - N

分析一下这个公式:

2L一定为偶数,n*c也一定为偶数,但是n*c-N一定为奇数,因为在条件N就为奇数,

所以我们推出来的公式是错的,也就是说如果N为奇数,为偶数,则两指针永远不会相遇这个条件不成立,即不会出永远追不上的情况,所以不论什么情况两指针都会在某一轮的追逐中相遇

3.slow一次走n步fast一次走m步一定会相遇吗? (m>n>1)

        这种情况和第二种情况分析过程类似,假设slow入环时,fast和slow之间距离为N,每走一步两者距离减(m-n),当N%(m-n)时,两指针便可相遇,由于这类问题给出实际值时才有意义,所以就不对其过多分析了


接下来我们解决最后一个问题:

如何找到链表的如环点?

题目描述:

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

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

不允许修改 链表。

分析:

这个题还是采用快慢指针的方法,slow一次走一步,fast一次走两步

由于fast速度是slow的二倍,所以相遇时,fast所走路程为slow的两倍,即

2*(L+x) = L+n*c+x

化简为: L = n*c - x

由这个公式就可以推出:

一个指针从头开始走,一个指针从相遇点开始走,他们会在入环点相遇

有了这个理论,这个题就可以迎刃而解了,我们先找出相遇点(如何找相遇点在前言所提文章中讲过),在让两指针,一个从头开始走,一个从相遇点开始走,判断哪个点符合这个公式

代码:


struct ListNode *detectCycle(struct ListNode *head) {
    struct ListNode *slow=head;
    struct ListNode *fast=head;

    while(fast&&fast->next)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)//找相遇点
       {
           struct ListNode* meet=slow;//相遇点
           while(meet!=head)
           {
               head=head->next;
               meet=meet->next;
           }
                return meet;
       }
    }
    return NULL;
}

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

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

相关文章

网络工程师回顾学习(第二部分)

第六章:网络互连与互联网 需要掌握: (1)网络互连设备 (2)网络互连的基本原理和关键技术 (扩展:TCP/IP协议簇) (3)Internet协议及其提供的网络…

Android---屏幕适配的处理技巧

在几年前,屏幕适配一直是困扰 Android 开发工程师的一大问题。但是随着近几年各种屏幕适配方案的诞生,以及谷歌各种适配控件的推出,屏幕适配也显得越来越容易。下面,我们就来总结一下关于屏幕适配的那些技巧。 ConstraintLayout …

CSRF(跨站请求伪造)攻击演示

目录 CSRF(跨站请求伪造)攻击演示CSRF 是什么CSRF 演示项目代码CSRF 演示过程服务启动演示 CSRF(跨站请求伪造)攻击演示 CSRF 是什么 CSRF(Cross-Site Request Forgery)跨站请求伪造,是一种网络安全攻击,其目标是利用被攻击者在…

【FastCAE源码阅读7】视图方向切换按钮实现原理

在FastCAE工具栏上有视图切换按钮,如下图所示: 本文介绍如何实现。 FastCAE集成了Python解析器,当单击按钮时,中间用Python执行的,最后调用MainWindow.dll库接口实现的。 具体的Python代码在Python模块的py文件夹下的…

Kali无线网卡无法识别

啊莫,该不会有人Kali系统识别不了自己的无线网卡吧! 环境:本来用作监听功能的3037芯片无线网卡,自己胡乱调,一不小心调试成了物理网卡的功能,变成了WLAN2网卡,结果用在了Windows系统上!如果你也是这样,点开你的网络适配器看看吧! 解决思路:1.删驱动 删除Windows上的…

基于JavaWeb+SSM+Vue微信小程序校园兼职任务平台系统的设计和实现

基于JavaWebSSMVue微信小程序校园兼职任务平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 随着社会的发展和全球疫情的冲击,大学生的就业形势越来越严峻。越…

PLC开放式以太网通信网络状态查看工具netstat

在进行PLC的开放式以太网通信时,为了查看网络状态我们可以利用ping这个强有力的工具,还可以使用netstat这个工具。 博途PLC开放式以太网通信 UDP通信 博途PLC 1200/1500PLC开放式以太网通信TSEND_C通信(UDP)_RXXW_Dor的博客-CSDN博客文章浏览阅读1.7k次。开放式TSEND_C通信…

地理数据常用处理

自助式绘图工具kepler UTM坐标转WGS84 首先根据UTM对应表找到目标地区的编号,中国东部地区属于UTM Zone 50N 再查找UTM 50N 的EPSG标准 https://epsg.io/?qUTMzone50N 得到 EPSG:32650 Transform coordinates geohash编码与解码 import transbigdata as tbd …

LeetCode(1)合并两个有序数组【数组/字符串】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 88. 合并两个有序数组 1.题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。 请你 合并 nums2 到 nums1 中,使合…

Postman —— post请求数据类型

1、Postman中post的数据类型 post中有以下数据类型 1、form-data 2、x-www-form-urlencoded 3、raw 4、binary 2、Postman请求不同的post数据类型 from-data multipart/form-data,它将表单的数据组织成Key-Value形式,也可以上传文件,当…

Shell速成:快速提升你的Linux命令行技能

1 diff 对比文件不同 diff file1 file2 # 区分两个文件不同的地方[num1,num2][a|c|d][num3,num4] num1,num2 ##第一个文件中的行 a ##添加 c ##更改 d ##删除 < ##第一个文件中的内容 > ##第二个文件中的内容 num3,num4 ##第二个文件中的行-b忽略空格 -B忽略空行 -i…

【笔记】回顾JavaWeb结合自身开发的项目——分层解耦与IOC、MySQL简单查询

分层解耦的三层架构 如下图所示是手术训练系统中的实现&#xff1a; 如果你需要从new EmpServiceA()变为new EmpServiceB()&#xff0c;那么必然需要修改Service和Controller层的代码&#xff0c;那么如果我们不new 这个对象呢&#xff1f;是不是就不需要依赖Controller层。 …

关于maven读取settings.xml文件的优先级问题

今天在IDEA中配置maven的setting.xml文件路径指向的.m2路径下的setting_a.xml文件&#xff0c;同时&#xff0c;我的maven3.6.3也放在.m2中。 [1] .m2文件夹 [2] apache-maven-3.6.3文件夹 然后&#xff0c;在IDEA中打包发布时发现&#xff0c;无论如何都读取不到指定的setti…

GPT最佳实践:五分钟打造你自己的GPT

前几天OpenAI的My GPTs栏目还是灰色的&#xff0c;就在今天已经开放使用了。有幸第一时间体验了一把生成自己的GPT&#xff0c;效果着实惊艳&#xff01;&#xff01;&#xff01;我打造的GPT模型我会放到文章末尾&#xff0c;大家感兴趣也可以自己体验一下。 打造自己的GPT模型…

小程序如何设置下单提示语句

下单提示会展示在购物车和提交订单页面&#xff0c;它可以帮助商家告知客户事项&#xff0c;提高用户体验和减少错误操作。例如提示&#xff1a;商品是否包邮、某些区域是否发货、商品送达时间等等。 在小程序管理员后台->配送设置处&#xff0c;填写下单提示。在设置下单提…

使用电阻检测仪是否能满足生产车间防静电要求

在现代工业生产中&#xff0c;静电对产品质量和人员安全造成的影响越来越受到重视。特别是在电子、半导体、化工等领域&#xff0c;静电问题可能导致产品损坏、人员触电等严重后果。因此&#xff0c;生产车间的防静电工作显得尤为重要。而电阻检测仪作为一种常用的防静电工具&a…

​软考-高级-系统架构设计师教程(清华第2版)【第2章 计算机系统基础知识-思维导图】​

软考-高级-系统架构设计师教程&#xff08;清华第2版&#xff09;【第2章 计算机系统基础知识-思维导图】 课本里章节里所有蓝色字体的思维导图

【分布式id生成系统——leaf源码】

分布式id生成系统——leaf源码 号段模式双buffer优化id获取 Leaf &#xff0c;分布式 ID 生成系统&#xff0c;有两种生成 ID 的方式&#xff1a; 号段模式Snowflake模式 号段模式 由于号段模式依赖于数据库表&#xff0c;我们先看一下相关的数据库表&#xff1a; biz_tag&…

【Unity插件】分享几个完全免费的2D角色动画生成器(推荐收藏)

文章目录 前言一、lpc-character-generator二、Universal-LPC-Spritesheet-Character-Generator三、UP主开发的2D人物换装系统四、Character Editor: Megapack完结 前言 你可能游戏开发能力很强&#xff0c;但是正愁于2D角色动画&#xff0c;那么这篇文章就是为你而准备的&…

Jira Software Enterprise Crack

Jira Software Enterprise Crack Jira软件是为您的应用程序组中的每一个成员设计、监控和启动优秀软件的。 策略&#xff1a;生成用户故事和问题&#xff0c;策略冲刺&#xff0c;并在应用程序团队中分配任务。 跟踪&#xff1a;在具有绝对可见性的完整背景下&#xff0c;确定团…