鱼C论坛

 找回密码
 立即注册
查看: 3427|回复: 7

[已解决]单链表比较步数判断有环

[复制链接]
发表于 2020-5-26 18:42:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. int HasLoop(LinkList L)
  2. {
  3.         LinkList cur1 = L;
  4.         int pos1 = 0;
  5.         while(cur1)
  6.         {
  7.                 LinkList cur2 = L;
  8.                 int pos2 = 0;
  9.                 while(cur2)
  10.                 {
  11.                         if(cur2 == cur1)
  12.                         {
  13.                                 if(pos1 == pos2)
  14.                                 {
  15.                                         break;
  16.                                 }
  17.                                 else
  18.                                 {
  19.                                         printf("%d", pos2);
  20.                                         return 1;
  21.                                 }
  22.                         }
  23.                         cur2 = cur2->next;
  24.                         pos2++;
  25.                 }
  26.                 cur1 = cur1->next;
  27.                 pos1++;
  28.         }
  29.         return 0;
  30. }
复制代码

cur2 = cur2->next;如果有环的话,不就是在while(cur2)里面死循环了吗
最佳答案
2020-5-28 20:05:06
麻麦皮 发表于 2020-5-28 17:11
我看懂了你的代码,你看一下我发的代码

while(cur2)里面cur2 = cur2->next不就是无限循环无法退出了吗

这层循环的退出方式分两种情况,并不是直接while条件判断的
1.如果没有回路,外面每循环一次,里层循环最终pos1和pos2会相等,然后break跳到外层循环,
cur1会遍历走到最后一个节点,整个函数结束
2.如果有回路,外面和里面都不会因为指向NULL而停止;cur1走到原本该向前走的地方却向后走了
,而cur2总是从起点出发,这样它们再次相遇的时候cur1走的步数比cur2多,就会执行return语句
直接退出函数
可以调试一下试试
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-5-26 19:38:33 | 显示全部楼层
赚小钱 发表于 2020-5-26 19:20
不懂你的比较步数是什么意思

你这是快慢指针,小甲鱼线性表14讲了一个方法就是比较步数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-28 17:11:13 | 显示全部楼层
Mr、渐行渐远 发表于 2020-5-28 08:44
内层循环目的是让cur2追上cur1,当cur2追上cur1的时候,如果有环,就直接退出函数了,如果没环,就会跳出里 ...

我看懂了你的代码,你看一下我发的代码

while(cur2)里面cur2 = cur2->next不就是无限循环无法退出了吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-28 20:36:45 | 显示全部楼层
Mr、渐行渐远 发表于 2020-5-28 20:05
这层循环的退出方式分两种情况,并不是直接while条件判断的
1.如果没有回路,外面每循环一次,里层循环 ...

懂了,我瞎了没看到break以为一直在里面循环
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-8 03:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表