社区
C语言
帖子详情
单向链表内部循环问题
郑大满
2003-11-21 05:50:42
一个长度未知的单向链表可能内含循环(最后一个节点指向链表中的另一个节点,而不是指向NULL).假设你只能使用两个指针,它们初始化时都指向这个单向链表头,说明你怎么去判断这个链表中是否内含循环?(链表内的节点数是有限的,而你必须证明算法可以在有限步内完成)
...全文
49
4
打赏
收藏
单向链表内部循环问题
一个长度未知的单向链表可能内含循环(最后一个节点指向链表中的另一个节点,而不是指向NULL).假设你只能使用两个指针,它们初始化时都指向这个单向链表头,说明你怎么去判断这个链表中是否内含循环?(链表内的节点数是有限的,而你必须证明算法可以在有限步内完成)
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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位后与另一指针指向同一位置的情况。所以该算法可以判断是否存在循环,也可以在有限步内结束。
数据结构
链表:
单向链表
->双向链表->单项
循环
链表->双向
循环
链表 栈:内置动态生成完成的栈 化合物:--双端羟基->
循环
体积->
循环
双端羟基 哈希表 树形结构 二叉搜索树 AVL树 红黑树:TreeMap和TreeSet
内部
使用了红黑树 B树...
【数据结构】之
单向链表
、双端(单向)链表、
循环
(单向)链表
单向链表
、双端(单向)链表、
循环
(单向)链表示意(简)图:
单向链表
:只有一个指针指向头结点。 双端(单向)链表:有一个指针指向头结点,还有一个指针指向尾节点。
循环
(单向)链表:指向形成一个闭环。 双端...
从零手写JDK底层队列
手写JDK的单向双向链表的实现。链表属于java数据结构的一种。大公司面试的必问的。 好记性不如烂笔头。自己手写一个链表的实现。一辈子都不会忘记 所涉及知识点->
单向链表
->双向链表 ->JDK底层cas的使用-&...
链表(三)单向
循环
链表与双向
循环
链表
观察
单向链表
和单向
循环
链表的区别: 显然,
循环
链表和普通链表的区别在于,尾节点的next指针指向了头节点。而对于这条指向的维护也只在于add和remove方法,因此
循环
链表仅仅在这个方法上有所不同。(普通链表的...
java实现
单向链表
目录
单向链表
示意图:
单向链表
实现代码:测试:结果:
单向链表
示意图: 以下是单链表相对于双链表的优缺点。 优点 (1) 只有一个指向下一个节点的指针。 (2)
单向链表
增加删除节点简单。遍历时候不会死
循环
。 ...
C语言
69,368
社区成员
243,081
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章