这题目还是慢有意思的。

题目:0.如何判断单链表里面是否有环?

算法的思想是设定两个指针p, q,其中p每次向前移动一步,q每次向前移动两步。那么如果单链表存在环,则p和q相遇;否则q将首先遇到null。
这里主要理解一个问题,就是为什么当单链表存在环时,p和q一定会相遇呢?

假定单链表的长度为n,并且该单链表是环状的,那么第i次迭代时,p指向元素i mod n,q指向2i mod n。因此当i≡2i(mod n)时,p与q相遇。而i≡2i(mod n) => (2i - i) mod n = 0 => i mod n = 0 => 当i=n时,p与q相遇。这里一个简单的理解是,p和q同时在操场跑步,其中q的速度是p的两倍,当他们两个同时出发时,p跑一圈到达起点,而q此时也刚好跑完两圈到达起点。
那么当p与q起点不同呢?假定第i次迭代时p指向元素i mod n,q指向k+2i mod n,其中0<k<n。那么i≡(2i+k)(mod n) => (i+k) mod n = 0 => 当i=n-k时,p与q相遇。

解决方案:

推广:

1. 如果两个指针的速度不一样,比如p,q,( 0<p<q)二者满足什么样的关系,可以使得两者肯定交与一个节点?

Sp(i) = pi

Sq(i) = k + qi

如果两个要相交于一个节点,则 Sp(i) = Sq(i) =>  (pi) mod n = ( k+ qi ) mod n =>[ (q -p)i + k ]  mod n =0

=>  (q-p)i + k  = Nn [N 为自然数]

=>  i = (Nn -k) /(p-q)

i取自然数,则当 p,q满足上面等式 即 存在一个自然数N,可以满足Nn -k 是 p - q 的倍数时,保证两者相交。

特例:如果q 是p 的步长的两倍,都从同一个起点开始,即 q = 2p , k =0, 那么等式变为: Nn=i: 即可以理解为,当第i次迭代时,i是圈的整数倍时,两者都可以交,交点就是为起点。

2.如何判断单链表的环的长度?

这个比较简单,知道q 已经进入到环里,保存该位置。然后由该位置遍历,当再次碰到该q 位置即可,所迭代的次数就是环的长度。

3. 如何找到链表中第一个在环里的节点?

假设链表长度是L,前半部分长度为k-1,那么第一个再环里的节点是k,环的长度是 n, 那么当q=2p时, 什么时候第一次相交呢?当q指针走到第k个节点时,q指针已经在环的第 k mod n 的位置。即p和q 相差k个元素,从不同的起点开始,则相交的位置为 n-k, 则有了下面的图:

从图上可以明显看到,当p从交点的位置(n-k) ,向前遍历k个节点就到到达环的第一个几点,节点k.

算法就很简单: 一个指针从p和q 中的第一次相交的位置起(n-k),另外一个指针从链表头开始遍历,其交点就是链表中第一个在环里的交点。

4. 如果判断两个单链表有交?第一个交点在哪里?

这个问题画出图,就可以很容易转化为前面的题目。

将其中一个链表中的尾节点与头节点联系起来,则很容发现问题转化为问题3,求有环的链表的第一个在环里的节点。

转载于:https://www.cnblogs.com/alexzp/archive/2011/12/19/2293488.html

如何判断单链表里面是否有环【转载】相关推荐

  1. 笔面集锦:判断单链表里面是否有环及相关扩展题

    源于网络 1.如何判断单链表里面是否有环? 设置两个指针(fast, slow),初始值都指向头,slow每次前进一步,fast每次前进二步,如果链表存在环,则fast必定先进入环,而slow后进入环 ...

  2. 数据结构和算法设计专题之---判断单链表中是否有环,环的长度,环的入口节点...

    题目: 给定一个单链表,只给出头指针head: 1.如何判断是否存在环? 2.如何知道环的长度? 3.如何找出环的连接点在哪里? 4.带环链表的长度是多少?   解法: 1.对于问题1,使用追赶的方法 ...

  3. c语言 判断链表之中是否有环,判断单链表中是否存在环(网上说的笔试题)

    2015-10-06 06:30:02 阅读( 83 ) #include "stdafx.h" typedef char eleType;    // 定义链表中的数据类型 ty ...

  4. 判断单链表是否存在环及环的入口点

    问题1:如何判断单链表中是否存在环(即上图中从结点E到结点R组成的环)? 解答: 设一快一慢两个指针(实际上是两个迭代器,Node *fast, *low)同时从链表起点开始遍历,其中快指针每次移动长 ...

  5. 题目:代码实现判断单链表是否有环

    一.单链表环的定义: 有环的定义是,链表的尾节点指向了链接中间的某个节点.比如下图,如果单链表有环,则在遍历时,在通过结点J之后,会重新回到结点D. 题目:0.如何判断单链表里面是否有环? 算法的思想 ...

  6. 单链表——判断一个单链表中是否有环

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.lyx.link;/*** * @author: liyixiang* @data:2014-10- ...

  7. 判断单链表是否存在环

    周末参加完美世界校园招聘中就有一道判断单链表是否有环的编程题. 写一个C/C++函数,来判断一个单链表是否具有环,如果存在环,则给出环的入口点. 有一个单链表,其中可能有一个环,也就是某个节点的nex ...

  8. 判断单链表中的元素是否递增_检测单链表中是否有环(C语言)

    检测单链表中是否有环(C语言) 方法:双指针法思路 使用两个指针,两个初始时都指向链表的头结点,然后one指针一次加一,另一个two指针一次加二. 在链表有环时,two指针与one指针相等就说明有环. ...

  9. 判断一个单链表中是否存在环

    #判断一个单链表中是否存在 环. #设置两个指针(fast, slow),初始值都指向头,slow每次前进1步,fast每次前进2步, 大概的思路如下: 如果链表存在环,则fast必定先进入环,而sl ...

  10. 如何判断单链表是否存在环

    原文:http://blog.csdn.net/liuxialong/article/details/6555850 如何判断单链表是否存在环 给定一个单链表,只给出头指针h: 1.如何判断是否存在环 ...

最新文章

  1. python爬取jsp网页_帮MM用python抓取index及一级目录下的所有符合要求的网页
  2. 深度学习(七十二)ssd物体检测
  3. Java SringBoot demo
  4. 网路防火墙iptables
  5. xinit启动X Window System过程初探(转)
  6. Hibernate的延迟加载问题
  7. 公司设备损坏了,怎么处理
  8. linux boa post方式失败,移植boa出现的错误及解决方法
  9. C语言中心对称图形定义,中心对称图形的定义
  10. 同表父子关系 的SQL查询语句的写法
  11. wamp5数据库密码修改
  12. 如何购买服务器及域名(阿里)
  13. word中目录出现省略号疏密不一致
  14. 什么是DDR RAM DDR2 DDR3 DDR4 之间有什么区别
  15. IBM WebSphere Portal宕机或性能低常见问题分析 及解决措施
  16. C语言三个数比较大小排序
  17. 安卓 linux launcher,关于android使用自己的launcher替换默认launcher的方法
  18. Multisim、proteus和protel的区别
  19. ASP.NET Core 3.1系列(30)——Newtonsoft.Json实现JSON的序列化和反序列化
  20. 灰色关联度分析excel步骤_技术 | 基于灰色关联与粗糙依赖度的甘肃兰州市区泥石流危险性评价...

热门文章

  1. XCODE中,修改苹果APP支持哪些设备
  2. GDI+处理带透明区域的png图片
  3. 无法更新标识列 wechatid_宿州售楼处精神堡垒生产厂家-弈博标识标牌制造
  4. C# 获取当前执行程序路径 获取路径 上上层目录 上层目录
  5. mysql as 后面字段,mysql 字段as详解及实例代码
  6. 为什么root下不能使用passwd命令_Linux:CentOS 7中常用的基础命令
  7. 软件系统换服务器地址,软件系统换服务器地址
  8. python闭包有什么作用_闭包在实际开发中有什么用?
  9. 单片机蜂鸣器编程音乐_工程师,还有6个引脚封装的单片机?涨知识了
  10. 字符数组中查找字符串或字符数组