判断链表有没有环(要求用两种方法)

daring_t 2010-05-27 06:12:14
给个思路吧,谢谢!
...全文
397 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
elepht 2010-05-31
  • 打赏
  • 举报
回复
快慢指针
yuanzhang198711 2010-05-28
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 artifly2000 的回复:]

追赶法
要不就在节点中加遍历标记,看顺序遍历是否会会访问到已遍历过的节点
[/Quote]
所言极是,两种方法,都比较好。可能第二种的开销更吧,需要另外开辟空间。
阿磊2013 2010-05-28
  • 打赏
  • 举报
回复
追赶法,学习了。我认为如果能对遍历过的节点加个标记,也是一个不错的方法
delphiwcdj 2010-05-28
  • 打赏
  • 举报
回复
快慢指针
bobo364 2010-05-28
  • 打赏
  • 举报
回复
追赶法不错,也算是学习了
ArtiFly2000 2010-05-28
  • 打赏
  • 举报
回复
追赶法
要不就在节点中加遍历标记,看顺序遍历是否会访问到已遍历过的节点
thinkli 2010-05-27
  • 打赏
  • 举报
回复
gz_qmc的程序是不是逻辑有些问题,链表有环,但环不一定就包含head,比如一个6字形的环。还是追赶法比较好吧。
gz_qmc 2010-05-27
  • 打赏
  • 举报
回复
当然,如果是双链
也可以这样

if(head->prev) 有LOOP
else 没有
gz_qmc 2010-05-27
  • 打赏
  • 举报
回复
刚才的原理是:

扫描的过程如果能回到头指针,就是循环的
daring_t 2010-05-27
  • 打赏
  • 举报
回复
就是跟head比较与步长法吗?
gz_qmc 2010-05-27
  • 打赏
  • 举报
回复
方法一:
bool CheckLoop(LPTYPE Head)
{
if(NULL==Head)
return false;
LPTYPE pCur=Head->next;
while(pCur)
{
if(pCur==Head)
return true;
pCur=pCur->next;
}
return false;
}
方法二:
bool CheckLoop(LPTYPE Head)
{
LPTYPE pCur=Head;
while(pCur->next)
{
if(pCur->next==Head)
return true;
pCur=pCur->next;
}
return false;
}
thehunters 2010-05-27
  • 打赏
  • 举报
回复
追赶法:
struct node
{
int data;
node*next;
}
bool loop(node*head )
{
if( !head->next->next)
return false;
node*p1 = head->next,*p2 = head->next->next ;

while(p1&&p2)
{

if(p1==p2)
return true;
p1 = p1->next;
if(p2->next)
p2 = p2->next->next;
else
break;
}
return false;
}
daring_t 2010-05-27
  • 打赏
  • 举报
回复
恩,还有没有其他的方法呢 ?
james_hw 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 daring_t 的回复:]
引用 5 楼 pengzhixi 的回复:

如果有环的话,移动2步的总有机会通过环绕到移动一步的后面并超过它。

如果链很长的话,那就至少要遍历一次半的链长了,有没有效率高些的方法啊?
[/Quote]

利用步长是标准答案。
qq120848369 2010-05-27
  • 打赏
  • 举报
回复
这有什么办法啊.
不走完永远不知道有没有环
daring_t 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 pengzhixi 的回复:]

如果有环的话,移动2步的总有机会通过环绕到移动一步的后面并超过它。
[/Quote]
如果链很长的话,那就至少要遍历一次半的链长了,有没有效率高些的方法啊?
pengzhixi 2010-05-27
  • 打赏
  • 举报
回复
如果有环的话,移动2步的总有机会通过环绕到移动一步的后面并超过它。
daring_t 2010-05-27
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 pengzhixi 的回复:]

前面那个一次移动2步,后面的一次移动一步。
[/Quote]
这个...麻烦能不能再详细点啊?
z569362161 2010-05-27
  • 打赏
  • 举报
回复
pengzhixi

你跟他们是一伙的。
pengzhixi 2010-05-27
  • 打赏
  • 举报
回复
前面那个一次移动2步,后面的一次移动一步。
加载更多回复(1)

70,022

社区成员

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

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