找含单链表的环入口点

问题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. ES6系列--对象扩展
  2. 电子商城实录------项目目录的结构搭建及其说明3
  3. Android Handler消息传递机制
  4. ExtJS学习:MVC模式案例(三)
  5. 1006. Sign In and Sign Out (25)
  6. d3.js 入门指南 - 仪表盘
  7. (原创)一个和c#中LazyT类似的c++ LazyT类的实现
  8. 35修改tomcat端口
  9. Go程序:演示数组切片用法
  10. 简单记录一次ORA-00600 kcratr_nab_less_than_odr
  11. 帝国CMS7.5仿可可礼物网漂亮大气淘宝客网站源码 带手机版+火车头采集
  12. MacOS删除开机启动项
  13. 解决Windows10 14393版本迅雷崩溃问题
  14. 网站服务器迁移域名怎么配置文件,记录网站服务器搬家如何迁移 Let’s Encrypt 证书 | 老左笔记...
  15. 刷题笔记 | 朋友圈、岛屿的最大面积、岛屿数量
  16. 基于nexus搭建golang代码下载代理缓存私服
  17. 【每日新闻】雷军:5G+AIoT是下一代的超级互联网
  18. 七牛云 阿里云图片存储 新增套餐 分页 定时任务Quartz(作业:编辑和删除功能)
  19. 识别iPad1还是iPad2
  20. 下列不是python对文件的读操作方法_以下选项不是Python文件读操作

热门文章

  1. MSDN最新的2007年6月的中文版本发布了
  2. ASPNET MVC Error 403.14
  3. 2018.12.27|区块链技术头条
  4. 『不再迷茫 - 正则表达式』JS正则要点梳理 持续更新
  5. 最简单的小程序怎么做?
  6. Tomcat5.5链接Oracle、DB2、MySQL数据源实现JSP下拉框的填充
  7. 使用 openssl 生成证书
  8. Eclipse中Build Workspace 优化
  9. Objective-C 常用代码
  10. 比特币网站Flexcoin遭黑客攻击 损失极大 被迫关闭