求单链表是否存在环路

nandizhu 2009-01-18 08:29:56
如题,求一单链表是否存在回路,如存在则返回出现回路的第一个节点,若不存在则返回NULL

...全文
407 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
ted_zhao 2011-01-29
  • 打赏
  • 举报
回复
I want to see the above contents!
ggeneral2 2009-02-02
  • 打赏
  • 举报
回复
这道题,可以去看一看《C专家编程》的最后一章。有。
TimeMaster 2009-01-21
  • 打赏
  • 举报
回复
sorry
我错了
不过我不是针对你的
我只是觉得不适合在这问算法
只适合问些非算法的技术问题
[Quote=引用 13 楼 litaoye 的回复:]
11楼的方法确实要比我说的hash要好,如果保持p2的步长为2,那么p2与p1第一次相遇与第二次相遇,
之间的所走的步数就是环路的长度。当然这个思路可能比这道题本身更有价值。

不过实在犯不着在12楼那么尖锐,我算法不行不代表别人水平也不行,再说这里谁也没说自己算法NB,
不是都在学么,等我真的会点东西了,我去别的论坛转悠时也绝不会说你们这水平还差点,你们都该去csdn看看。

其实谦虚比算法更难学,也更有用。

[/Quote]
绿色夹克衫 2009-01-20
  • 打赏
  • 举报
回复
恩,用地址可以,只要保证不同的节点的hash值不同,相同节点的hash值相同就可以!

[Quote=引用 9 楼 nandizhu 的回复:]
怎么去hash???用地址???
[/Quote]
绿色夹克衫 2009-01-20
  • 打赏
  • 举报
回复
11楼的方法确实要比我说的hash要好,如果保持p2的步长为2,那么p2与p1第一次相遇与第二次相遇,
之间的所走的步数就是环路的长度。当然这个思路可能比这道题本身更有价值。

不过实在犯不着在12楼那么尖锐,我算法不行不代表别人水平也不行,再说这里谁也没说自己算法NB,
不是都在学么,等我真的会点东西了,我去别的论坛转悠时也绝不会说你们这水平还差点,你们都该去csdn看看。

其实谦虚比算法更难学,也更有用。

[Quote=引用 12 楼 TimeMaster 的回复:]
ps
不要盯着一个论坛上
尤其是算法之类的
不要到csdn来问
技术问题可以来问
高手如云
但是算法的话
这边很多人连什么是算法其实都不懂
就比如今天推荐的帖子里那个
Aoqun[eglic推荐] 算法大比拼(看看谁是真真的高手)?(java C... [C#]
这个能叫算法比拼吗
只是编程技巧比拼罢了
不过那个帖子确实也能学到些东西就是了
[/Quote]
TimeMaster 2009-01-20
  • 打赏
  • 举报
回复
ps
不要盯着一个论坛上
尤其是算法之类的
不要到csdn来问
技术问题可以来问
高手如云
但是算法的话
这边很多人连什么是算法其实都不懂
就比如今天推荐的帖子里那个
Aoqun[eglic推荐] 算法大比拼(看看谁是真真的高手)?(java C... [C#]
这个能叫算法比拼吗
只是编程技巧比拼罢了
不过那个帖子确实也能学到些东西就是了
TimeMaster 2009-01-20
  • 打赏
  • 举报
回复
直接转帖了
懒得敲字

发信人: len1982 (牧童|天黑黑), 信区: Algorithm
标 题: 关于链表环的判断问题
发信站: 水木社区 (Thu Dec 11 21:31:56 2008), 站内

一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有环的
话两者必然重合,反之亦然):
关于这个解法最形象的比喻就是在操场当中跑步,速度快的会把速度慢的扣圈

可以证明,p2追赶上p1的时候,p1一定还没有走完一遍环路,p2也不会跨越p1多圈才追上

我们可以从p2和p1的位置差距来证明,p2一定会赶上p1但是不会跳过p1的

因为p2每次走2步,而p1走一步,所以他们之间的差距是一步一步的缩小,4,3,2,1,0
到0的时候就重合了

根据这个方式,可以证明,p2每次走三步以上,并不总能加快检测的速度,反而有可能判别
不出有环

既然能够判断出是否是有环路,那改如何找到这个环路的入口呢?

解法如下: 当p2按照每次2步,p1每次一步的方式走,发现p2和p1重合,确定了单向链表有
环路了

接下来,让p2回到链表的头部,重新走,每次步长不是走2了,而是走1,那么当p1和p2再次
相遇的时候,就是环路的入口了。

这点可以证明的:

在p2和p1第一次相遇的时候,假定p1走了n步骤,环路的入口是在p步的时候经过的,那么有

p1走的路径: p+c = n; c为p1和p2相交点,距离环路入口的距离

p2走的路径: p+c+k*L = 2*N; L为环路的周长,k是整数

显然,如果从p+c点开始,p1再走n步骤的话,还可以回到p+c这个点

同时p2从头开始走的话,经过n不,也会达到p+c这点

显然在这个步骤当中p1和p2只有前p步骤走的路径不同,所以当p1和p2再次重合的时候,必
然是在链表的环路入口点上。

我不明白的是这个:
显然,如果从p+c点开始,p1再走n步骤的话,还可以回到p+c这个点

为什么p1再走n步肯定会到p+c这个点呢?

--
把自己当成别人;把别人当成自己;把别人当成别人;把自己当成自己.



※ 来源:·水木社区 newsmth.net·[FROM: 220.205.145.*]
发信人: techyb (struggleyb), 信区: Algorithm
标 题: Re: 关于链表环的判断问题
发信站: 水木社区 (Thu Dec 11 21:41:27 2008), 站内

n是环的长度啊,走环一周,当然回到自己的位置

【 在 len1982 (牧童|天黑黑) 的大作中提到: 】
: 一种O(n)的办法就是(搞两个指针,一个每次递增一步,一个每次递增两步,如果有?
的话两者必然重合,反之亦然):
: 关于这个解法最形象的比喻就是在操场当中跑步,速度快的会把速度慢的扣圈
: 可以证明,p2追赶上p1的时候,p1一定还没有走完一遍环路,p2也不会跨越p1多圈才追?
: ...................

--

发信人: len1982 (牧童|天黑黑), 信区: Algorithm
标 题: Re: 关于链表环的判断问题
发信站: 水木社区 (Thu Dec 11 21:51:03 2008), 站内

n怎么会是环的长度?
环的长度不是不确定的吗?
实在是想不明白

【 在 techyb (struggleyb) 的大作中提到: 】
: n是环的长度啊,走环一周,当然回到自己的位置


--
台球三项基本原则:走位基本靠喊,进球基本靠蒙,赢球基本靠摆
发信人: threader (例如,每天爱你多一些), 信区: Algorithm
标 题: Re: 关于链表环的判断问题
发信站: 水木社区 (Thu Dec 11 22:20:59 2008), 站内

p1走的路径: p+c = n; c为p1和p2相交点,距离环路入口的距离

p2走的路径: p+c+k*L = 2*N; L为环路的周长,k是整数
~~这里是n

算一下 n=p+c=k*L
是环长的整数倍
所以走n步还在那个p+c点
【 在 len1982 (牧童|天黑黑) 的大作中提到: 】
: n怎么会是环的长度?
: 环的长度不是不确定的吗?
: 实在是想不明白
: ...................

--
nandizhu 2009-01-19
  • 打赏
  • 举报
回复
如果不能修改节点结构呢???
yhec 2009-01-19
  • 打赏
  • 举报
回复
节点中再加一个标志镁,如果访问过,标志中置个1,如果这个节点已经访问过,说明出现了环路
nandizhu 2009-01-19
  • 打赏
  • 举报
回复
如何返回出现回路的第一个起点呢???
nandizhu 2009-01-19
  • 打赏
  • 举报
回复
怎么去hash???用地址???
绿色夹克衫 2009-01-19
  • 打赏
  • 举报
回复
如果不求头一个环路节点,就用步长为1和2的两个指针判断,两个指针如果在指向null前相遇,则说明有环路

如果要求第一个环路节点,可以再开一部分空间,其实就相当于hash,新遍历到的节点加入hash表,

如果hash表中已存在该节点,则该节点为第一个环路节点.

[Quote=引用 6 楼 nandizhu 的回复:]
如果不能修改节点结构呢???
[/Quote]
jieao111 2009-01-19
  • 打赏
  • 举报
回复
那就弄一个快指针和一个慢指针来遍历


ps:美女,这个题见过很多遍了,你Google一下一定能搜到一大堆
na2650945 2009-01-18
  • 打赏
  • 举报
回复
单链表.
设立两个指针被。一个固定。
一个沿链表向下。
如果指针再能重叠。
就有贿赂。
如果向下移动的指针指向空。
就不存在回路。
sincor 2009-01-18
  • 打赏
  • 举报
回复
翻翻书

33,008

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧