单向链表内部循环问题

郑大满 2003-11-21 05:50:42
一个长度未知的单向链表可能内含循环(最后一个节点指向链表中的另一个节点,而不是指向NULL).假设你只能使用两个指针,它们初始化时都指向这个单向链表头,说明你怎么去判断这个链表中是否内含循环?(链表内的节点数是有限的,而你必须证明算法可以在有限步内完成)
...全文
49 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
spin 2003-11-21
  • 打赏
  • 举报
回复
留下记号的想法不太现实,
1)为结点追加空间??
2)辅助向量?无法实现!若有实现方法就告知。
spin 2003-11-21
  • 打赏
  • 举报
回复
假设只能使用两个指针*p、*q,它们初始化时都指向这个单向链表头。
p先前进,在p每往前走一步,用一个量n1记录p走的次数;
再让q从表头开始往后走,用一个量n2记录q走的次数;
一直走到等于p,判断n1与n2
1)n1<n2,即说明有循环;
2)n1=n2,没有循环;
3)error.
每次循环开始时,q又指回表头!

时间复杂度为O(N*(N+1)/2)(N为结点数,且有表结点)

希望对你有帮助!
loveisbug 2003-11-21
  • 打赏
  • 举报
回复
留个记号。
wnewstart 2003-11-21
  • 打赏
  • 举报
回复
假设两个指针分别为*a,*b,初始指向表头。变量n初始值为1。
1、a向后移动n位。
其间如出现NULL指针,说明不含循环,则输出信息并退出。
如顺利移动了n位,则判断a是否等于b。
如相等,说明含循环,则输出信息并退出。
如不等,进入下一步。
2、令b=a,n=n+1;
回到第一步。

因为链表节点数有限,如果存在循环,则在循环中的节点数也有限。假设有m个节点在循环中。那么在进入循环部分后,如果n<=m,随着n增加到m就会出现一指针移动n位后与另一指针指向同一位置的情况。如果n>m,随着n增加到km(k为正整数)就会出现一指针移动n位后与另一指针指向同一位置的情况。所以该算法可以判断是否存在循环,也可以在有限步内结束。

69,368

社区成员

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

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