出一道面试时遇到的算法题

popo00fa 2011-08-15 11:54:25
题目:
如何判断一个单链表是否有环。即最后一个节点的next指针没有指向NULL,而是指向了前面的某一个节点。

要求:尽量考虑空间/时间复杂度
...全文
220 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
AnYidan 2011-08-17
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 l369294289 的回复:]
引用 7 楼 dongguan131 的回复:

6楼头像是谁?告诉我吧。。。

刘涛
[/Quote]

燕姿
icemornings 2011-08-16
  • 打赏
  • 举报
回复
这题怎么感觉那么熟悉……好像做过……
---------------
1、类似1楼的方法。
2、定义两个指针,fast和slow,fast每次走2步,slow每次走1步, 如果有环,那么最终fast和slow会相遇
(可以想象两个人以不同的速度在一个环形跑道上,快的人最终会再追上慢的人)
3、逆转链表,遍历链表并把每个节点的方向逆转(Header指向NULL,下一个节点指向Header……),如果有环的话,新的链表的New_Header肯定和原来的Header相同,(相当于绕了个圈走回来了)
-------------
我的第一想法和1楼的一样……
l369294289 2011-08-16
  • 打赏
  • 举报
回复
菜鸟路过~~~~~

每个节点里面设置一个标志量,遍历了的就是1,没遍历就是0,如果一直遍历下去遇到了已经遍历的,就有环。
popo00fa 2011-08-16
  • 打赏
  • 举报
回复
不错,果然有高手。。
我当时只想到了逆转链表的算法,不过面试官说,你这样做就把一个链表的顺序改变了,但如果再逆转回来会浪费时间,所以面试官给出了“步长法”
shi3590 2011-08-16
  • 打赏
  • 举报
回复
恩。老题了。步长法是可以判断,如果要返回节点,可以用扫描法,只要判断next节点有没有在前面出现过即可。不过从复杂度考虑,只有步长法了。
liangyonglou 2011-08-16
  • 打赏
  • 举报
回复
这是个老题了
morebread 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 zsc_ericluo 的回复:]

引用 2 楼 icemornings 的回复:
这题怎么感觉那么熟悉……好像做过……
---------------
1、类似1楼的方法。
2、定义两个指针,fast和slow,fast每次走2步,slow每次走1步, 如果有环,那么最终fast和slow会相遇
(可以想象两个人以不同的速度在一个环形跑道上,快的人最终会再追上慢的人)
3、逆转链表,遍历链表并把每个节点的方向逆转(H……
[/Quote]

第一个效率不错,不过可能要改变节点定义
第二个以前看到过
第三个我也没看懂……
l369294289 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 dongguan131 的回复:]

6楼头像是谁?告诉我吧。。。
[/Quote]
刘涛
luciferisnotsatan 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 anyidan 的回复:]

c 专家编程 有讲

--- 追赶法
(一个指针每次移动一步,另一指针每次移动两步)
[/Quote]
++
低头路过 2011-08-16
  • 打赏
  • 举报
回复
6楼头像是谁?告诉我吧。。。
AnYidan 2011-08-16
  • 打赏
  • 举报
回复
c 专家编程 有讲

--- 追赶法
(一个指针每次移动一步,另一指针每次移动两步)
zsc_ericluo 2011-08-16
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 icemornings 的回复:]
这题怎么感觉那么熟悉……好像做过……
---------------
1、类似1楼的方法。
2、定义两个指针,fast和slow,fast每次走2步,slow每次走1步, 如果有环,那么最终fast和slow会相遇
(可以想象两个人以不同的速度在一个环形跑道上,快的人最终会再追上慢的人)
3、逆转链表,遍历链表并把每个节点的方向逆转(Header指向NULL,下一个节点指向Header………
[/Quote]
第二种方法效率貌似不好
第三个没看懂,见笑见笑。自己也只想到方法1,比较容易实现。。。
pengzhixi 2011-08-16
  • 打赏
  • 举报
回复
google "步长法"
modicum_lf 2011-08-16
  • 打赏
  • 举报
回复
个人愚见:

1.按顺序遍历,遍历的个数大于连表中结点的个数说明有环。

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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