判断单链表是否有环...?

Kiss_Bar 2011-05-06 05:08:44

typedef struct LNode
{
int data;
LNode *next;
}LNode ;
typedef LNode* LinkList;
//单链表有环返回true 否则返回false
bool is_looplist(LNode *head)
{
LNode *fast,*slow;
if (head == NULL || head->next == NULL)
{
return false;
}
fast = slow = head;

while(true)
{
if(!fast || !fast->next)
return false;
//为了防止fast跨过slow的情况,在每次判断的时候比较当前节点和下一节点
else if (fast == slow || fast->next == slow)
return true;
else
{
slow = slow->next;//一次跳一步
fast = fast->next->next;//一次跳两步
}
}
}


谁能解释下..
如果是大环能检测到吗..?比如说倒数第二个和顺数第三个成环了...谢谢..
...全文
518 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
test-20131128 2011-05-09
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 meteor_code 的回复:]

按找顺序遍历,遍历的个数大于连表中结点的个数说明有环
最好用双向连表,很容易就能检查出是否有环,以及环的位置
[/Quote]

这个题目里面的参数是const类型的,再说了,如果判断是否有环的时候把这个链表结构都给改了,判断出来也就没有多大意义了。
Kiss_Bar 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 ljt3969636 的回复:]

啊,我理解偏了,这样你想想两个指针进入环不管大环小环就出不来了,只能在环里绕了,之后都相当于一个圆环了....
[/Quote]
懂了..有环就都在环里面绕了..总有一天会追上.没环到fast->next == NULL的时候就结束了.
3X..
就想叫yoko 2011-05-06
  • 打赏
  • 举报
回复
小环这个方法也可以
Meteor_Code 2011-05-06
  • 打赏
  • 举报
回复
按找顺序遍历,遍历的个数大于连表中结点的个数说明有环
最好用双向连表,很容易就能检查出是否有环,以及环的位置
ljt3969636 2011-05-06
  • 打赏
  • 举报
回复
啊,我理解偏了,这样你想想两个指针进入环不管大环小环就出不来了,只能在环里绕了,之后都相当于一个圆环了....
Kiss_Bar 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 linxren 的回复:]

你在操场上跑步,一个跑得慢,一个跑得快,如果你们的跑道有环的话,那么快的就会追上慢的。
[/Quote]
有点道理..可是如何确定距离啊..?距离短了一样追不上呀..
Kiss_Bar 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 zhaopeng026 的回复:]

你这程序应该直接返回true了吧,看红色部分
C/C++ code

bool is_looplist(LNode *head)
{
LNode *fast,*slow;
if (head == NULL || head->next == NULL)
{
return false;
}
[color=#FF0000] fast = slo……
[/Quote]
嗯啦..发现了..现在能判断了...算法是对的..还是有点不理解.
Kiss_Bar 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ljt3969636 的回复:]

那个....
单链表只有一个前驱一个后继,成环只能是一个大圈,不能是一个绳套形的..怎么叫“倒数第二个和顺数第三个成环了”?
[/Quote]
比如说:小环:最后一个节点next域指到了倒数第一个节点.
大环:最后一个节点next域指向了第二个节点.
nemo 2011-05-06
  • 打赏
  • 举报
回复
你这程序应该直接返回true了吧,看红色部分

bool is_looplist(LNode *head)
{
LNode *fast,*slow;
if (head == NULL || head->next == NULL)
{
return false;
}
fast = slow = head;
while(true)
{
if(!fast || !fast->next)
return false;
//为了防止fast跨过slow的情况,在每次判断的时候比较当前节点和下一节点
else if (fast == slow || fast->next == slow)
return true;
else
{
slow = slow->next;//一次跳一步
fast = fast->next->next;//一次跳两步
}
}
}




linxren 2011-05-06
  • 打赏
  • 举报
回复
你在操场上跑步,一个跑得慢,一个跑得快,如果你们的跑道有环的话,那么快的就会追上慢的。
ljt3969636 2011-05-06
  • 打赏
  • 举报
回复
那个....
单链表只有一个前驱一个后继,成环只能是一个大圈,不能是一个绳套形的..怎么叫“倒数第二个和顺数第三个成环了”?
Kiss_Bar 2011-05-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 bdmh 的回复:]

好些不能,他者看似只判断相邻的两个,具体的你试试
[/Quote]
网上都说能,我也觉得不能,写代码测试了下...还真不能..现在不知道是我的测试代码出了问题,还是这个算法有问题.
Kiss_Bar 2011-05-06
  • 打赏
  • 举报
回复
一个每次递增一步,一个每次递增两步,如果有环的话两者必然重合...这是为什么咧..?
bdmh 2011-05-06
  • 打赏
  • 举报
回复
好些不能,他者看似只判断相邻的两个,具体的你试试

70,022

社区成员

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

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