社区
C语言
帖子详情
判断链表有没有环(要求用两种方法)
daring_t
2010-05-27 06:12:14
给个思路吧,谢谢!
...全文
496
21
打赏
收藏
判断链表有没有环(要求用两种方法)
给个思路吧,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
java怎么
判断
一个流程中
有没有
环
,Java
判断
链表
是否有
环
的
两种
实现
方法
package demo6;import java.util.HashMap;import demo6.LinkReverse2.Node;/***
判断
链表
是否有
环
的
方法
* @author mengfeiyang**/public class LinkLoop {public static boolean hasLoop(Node n){//定义两个指针tmp1,tmp2Node tmp1 = ...
判断
单
链表
是否有
环
的
两种
方法
如图,如果单
链表
有
环
,则在遍历时,在通过6之后,会重新回到3,那么我们可以在遍历时使用两个指针,看两个指针是否相等。
方法
一:使用p、q两个指针,p总是向前走,但q每次都从头开始走,对于每个节点,看p走的步数是否和q一样。如图,当p从6走到3时,用了6步,此时若q从head出发,则只需两步就到3,因而步数不等,出现矛盾,存在
环
方法
二:使用p、q两个指针,p每次向前走一步,q每次向前走两步,若...
如何
判断
链表
中是否有
环
今天面试被问住了,很惭愧啊,回来上网查了一下思路。自己写了点程序。 1.如何
判断
是否有
环
?如果有两个头结点指针,一个走的快,一个走的慢,那么若干步以后,快的指针总会超过慢的指针一圈。 2.如何计算
环
的长度?第一次相遇(超一圈)时开始计数,第二次相遇时停止计数。 3.如何
判断
环
的入口点:碰撞点p到连接点的距离=头指针到连接点的距离,因此,分别从碰撞点、头指针开始走,相遇的那个点就是连接
【算法】如何
判断
链表
有
环
如何
判断
单
链表
是否存在
环
有一个单向
链表
,
链表
当中有可能出现“
环
”,就像题图这样。如何用程序
判断
出这个
链表
是有
环
链表
? 不允许修改
链表
结构。 时间复杂度O(n),空间复杂度O(1)。
方法
一、穷举遍历
方法
一:首先从头节点开始,依次遍历单
链表
的每一个节点。每遍历到一个新节点,就从头节点重新遍历新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新
如何
判断
链表
有
环
(三种
方法
)
方法
一、穷举遍历
方法
一:首先从头节点开始,依次遍历单
链表
的每一个节点。每遍历到一个新节点,就从头节点重新遍历 新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节 点当中存在相同节点ID,则说明该节点被遍历过两次,
链表
有
环
;如果之前的所有节点当中不存在相同的 节点,就继续遍历下一个新节点,继续重复刚才的操作。 例如这样的
链表
:A->B->...
C语言
70,039
社区成员
243,246
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章