一个面试题

lrj00000 2005-06-14 12:49:14
如何快速检测一个巨大的单向链表是否有环啊?
...全文
447 点赞 收藏 11
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
xielaixiangjx 2005-06-15
好难懂呀,不错的主意
回复
hydvivian 2005-06-15
学习。。
回复
MagicCarmack 2005-06-15
楼上的算法可以
回复
QunKangLi 2005-06-15
最简单,估计也是比较经典的做法是两个指针:
慢指针一次进一步,快指针一次进两步。前进中遇到链结束符则退出,返回无循环;遇到两指针指向同一单元,则退出,返回有循环。----如果存在循环,快指针终于绕回去从再从后面追上慢指针。
int fun( node_t *list)
{
node_t *p1, *p2 ;
if( list == 0 ) return 0 ;
p2 = list, p1 = list->next ;
while( p1 && (p1 = p1->next) ) {
if( p1 == p2 ) return 1 ;
p1 = p1->next, p2 = p2->next ;
}
return 0 ;
}
回复
foochow 2005-06-15
学习
回复
xiedong1112 2005-06-15
听我说,你不需要用很多的算去处理,我只是给你讲一下思路,算法你自己去写吧:
第一:如果从头节点开始,那么你直接新建一个双向节点即指向第一个节点也指向最后一个节点,如果双向节点的指针都不为NULL,则是单链表,否则是双链表.
第二:如果从链表中的某一个节点,则只需先算出节点数,然后直接指向链尾,如果总节点数小于链尾数,则是单链表,否则是双链表.
第三:如果在链表外,不用考虑它就是双链表.
回复
haitingr 2005-06-14
<<Accelerated C++>>上的讲的很好
回复
happy_flying 2005-06-14
可以参考一下这个,讲得比较详细:
http://www.chinaunix.net/jh/23/410637.html
回复
daikaiming 2005-06-14
我觉得也只是个简单的办法。
回复
ahphone 2005-06-14
和我们公司的面试差不多
其实,问题的答案很简单的,不需要考虑特别多,
你想办法搜出重复的就可以了
回复
nasi00 2005-06-14
多少个结点?

n*log(n)的算法不知道算不算快速……
回复
发动态
发帖子
C语言
创建于2007-09-28

6.3w+

社区成员

C语言相关问题讨论
申请成为版主
社区公告
暂无公告