找含单链表的环入口点

问题1:怎样推断单链表中是否存在环(即下图中从结点E到结点R组成的环)?

分析:设一快一慢两个指针(Node *fast, *low)同一时候从链表起点開始遍历,当中快指针每次移动长度为2。慢指针则为1。则若无环,開始遍历之后fast不可能与low重合,且fast或fast->next终于必定到达NULL;若有环。则fast必定不迟于low先进入环,且因为fast移动步长为2,low移动步长为1,则在low进入环后继续绕环遍历一周之前fast必定能与low重合(且必定是第一次重合)。于是函数可写例如以下:

bool hasCircle(Node* head, Node* &encounter)
{Node *fast = head, *slow = head;while(fast && fast->next){fast = fast->next->next;slow = slow->next;if(fast == slow){encounter = fast;return true;}}encounter = NULL;return false;
}

问题2:若存在环,怎样找到环的入口点(即上图中的结点E)?

解答:如图中所看到的。设链起点到环入口点间的距离为x,环入口点到问题1中fast与low重合点的距离为y。又设在fast与low重合时fast已绕环n周(n>0),且此时low移动总长度为s,则fast移动总长度为2s。环的长度为r。则
        s + nr = 2s,n>0       ①
        s = x + y              ②
       由①式得  s = nr                
       代入②式得
       nr = x + y
       x = nr - y               ③
       现让一指针p1从链表起点处開始遍历,指针p2从encounter处開始遍历,且p1和p2移动步长均为1。则当p1移动x步即到达环的入口点,由③式可知,此时p2也已移动x步即nr - y步。

因为p2是从encounter处開始移动。故p2移动nr步是移回到了encounter处,再退y步则是到了环的入口点。也即,当p1移动x步第一次到达环的入口点时。p2也恰好到达了该入口点。于是函数可写例如以下:

Node* findEntry(Node* head, Node* encounter)
{ Node *p1 = head, *p2 = encounter;while(p1 != p2){p1 = p1->next;p2 = p2->next;}return p1;
}

原文来自:http://blog.csdn.net/wuzhekai1985/article/details/6725263

有错误欢迎提出, 分享请标明出处, 谢谢!

感觉好的话就顶一个。 感觉不错的话就踩一个。

菜鸟系列之C/C++经典试题(七)相关推荐

  1. 2013年计算机试题(三),2013年计算机等级考试(一级Ms Office)经典试题(三)及答案...

    2013年计算机等级考试(一级Ms Office)经典试题(三)及答案,更多计算机等级考试报名.报考条件.考试时间和历年真题,请访问计算机等级考试网(http://www.etest8.com/den ...

  2. 必看:C语言高效学习方法(附经典试题详解)

    C试题100例详解 写在前面 C语言高效学习方法 正片开始: 问题描述 课题分析 算法描述 自然语言方式描述 流程图方式描述 源代码 试验结果分析与讨论 写在前面 本专栏提供多于100道C试题解答,并 ...

  3. 【SQL查询系列】子查询经典案例

    文章目录 前言 数据库 查询案例 1. 查询工资最低的员工信息: last_name, salary 2. 查询平均工资最低的部门信息 3. 查询平均工资最低的部门信息和该部门的平均工资 4. 查询平 ...

  4. 2022年乡村医生考试经典试题及答案

    1.以下属于医疗机构从业人员基本行为规范的是(). A.尊重科学 B.规范行医 C.重视人文 D.规范文书 E.以上都是 2.热性惊厥持续状态治疗药物是 A.苯巴比妥 B.副醛 C.地西泮 D.水合氯 ...

  5. js经典试题之ES6

    js经典试题之ES6 1:在ECMAScript6 中,Promise的状态 答案:pending  resolved(fulfilled) rejected 解析: Promise对象只有三种状态: ...

  6. 数据库SQL面试题七则

    [试题一] 在一个表Student中,属性有学号SNo.性别Ssex,请用SQL写一个语句,查询男女生分别有多少人? SELECT count(*) Ssex FROM Student GROUP B ...

  7. js经典试题之数据类型

    js经典试题之数据类型 1:输出"B" + "a" + + "B" + "a"的值: 答案:BaNaNa. 分析:因为+ ...

  8. 微型计算机曾经使用过的字长,自考《计算机应用基础》模拟试题七

    单选题(每题1分,共40分) 1.远程登录服务是____. A.DNS B.FTP C.CHAT D.TELNET 2.通讯网中发送方和接收方之间的物理通路叫作_____. A.传输网络 B.传输电缆 ...

  9. JAVA sku商品数据经典试题

    JAVA sku商品数据经典试题 试题1 试题2 试题3 试题代码 试题所有相关代码github: 试题1 假设sku数据很多, 无法将sku列表完全加载到内存中,从/resources/data/d ...

最新文章

  1. 985高校挖出古墓!网友:毕业论文自己找上门来了
  2. sql server 的 money类型
  3. mysql ——MHA
  4. 单片机中如何将BCD码拆开_单片机二进制BCD码转换实验程序流程图
  5. ios跨线程通知_iOS多线程开发(三)---Run Loop(一)
  6. 网页版消消乐快速实现,无代码吗iVX 真那么简单?
  7. linux下python开发环境搭建_linux下python开发环境之二——安装Eclipse+PyDev
  8. ddr4服务器内存频率_金士顿DDR4-3200服务器内存通过完整测试
  9. 《哪吒》票房超《复联4》 位列中国电影票房总榜第三
  10. 用python写一个程序来验证每个数字的生成概率是否相同_Python实现简单生成验证码功能【基于random模块】...
  11. oracle杅擂踱阀葩,Oracle常用傻瓜问题1000问
  12. div显示图片_图片按照百分比显示部分,不变形
  13. 国内android源码下载方法
  14. 使用echarts画设备拓扑图
  15. saltstackmysql return报错
  16. DedeCMS快速建站
  17. OpenCV开发笔记(七十二):红胖子8分钟带你使用opencv+dnn+tensorFlow识别物体
  18. 看视频可以倍速播放的(主流播放器都可以)
  19. 基于java基于javaweb的管理系统设计与实现怎样选题思路分享
  20. java中 enum什么意思_enum在java中是什么意思

热门文章

  1. [case29]JDK11的ZGC小试牛刀
  2. 设计模式之三:观察者模式
  3. css3 rem的用法
  4. js中对于json判断的总结(持续整理中~)
  5. 查询SQL中日期条件
  6. JAVASCIPT实现WEB SERVER的问题
  7. java post上传进度,OkHttp实现文件上传进度
  8. Yarn分布式集群操作系统
  9. WordCount案例实现的11种方法
  10. 初级算法——删除排序数组中的重复项