社区
C语言
帖子详情
判断链表有没有环(要求用两种方法)
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)
判断
链表
是否有
环
判断
链表
是否有
环
的解法有很多,下面归纳几种常见算法。
判断
链表
是否存在
环
方法
一:通过双循
环
遍历完成,外层循
环
从头结点开始遍历,对于遍历到一个新节点newNode,内层循
环
都要从头结点遍历到该新节点的上一个节点head。如果
链表
无
环
,则newNode和head永不相等,否则就会相等。时间复杂度为O(n^2)。 public class LinkListCycle { public static class Node { private int data; pr
python
判断
链表
是否有
环
_
判断
链表
是否有
环
判断
一个单向
链表
是否有
环
。(指向表头结点的指针为head)
方法
一:(1)用两个指针p1和p2分别指向表头结点,即p1=p2=head(2)p1和p2分别采用1和2作为步长遍历该
链表
。(注意,p2应该检查当前结点的下一个结点是否为NULL)(3)如果p1或者p2遇到了NULL,则证明该
链表
没有
环
;若p1和p2在某时刻指向同一结点,则说明该
链表
有
环
。点击(此处)折叠或打开bool I***itsLoo...
如何
判断
链表
有
环
(三种
方法
)
方法
一、穷举遍历
方法
一:首先从头节点开始,依次遍历单
链表
的每一个节点。每遍历到一个新节点,就从头节点重新遍历 新节点之前的所有节点,用新节点ID和此节点之前所有节点ID依次作比较。如果发现新节点之前的所有节 点当中存在相同节点ID,则说明该节点被遍历过两次,
链表
有
环
;如果之前的所有节点当中不存在相同的 节点,就继续遍历下一个新节点,继续重复刚才的操作。 例如这样的
链表
:A->B->...
常见面试题:
链表
3-
判断
链表
是否有
环
以及
环
入口节点
常见面试题3:
链表
-
判断
链表
是否有
环
以及
环
入口节点 内容目录常见面试题3:
链表
-
判断
链表
是否有
环
以及
环
入口节点一、
判断
链表
是否有
环
1.解法1:使用列表2.解法2:快慢指针二、
链表
环
入口节点解法1:使用列表解法2:快慢指针
链表
可以分为单向
链表
、双向
链表
、
环
形
链表
。对于
环
形
链表
,如果我们事前不知道,遍历的时候就会出现死循
环
,导致程序失败。那么如何
判断
链表
是否有
环
以及
环
入口节点也是面试中经常问到的 一、
判断
链表
是否有
环
能想到的解法大概有
两种
,第一种就是把每次遍历的结果放到一个
链表
中,每次遍历的时候
判断
该链
美团一面:如何
判断
java
判断
链表
是否有
环
?这
两种
实现方式你都知道吗?
前言
判断
链表
是否为带
环
链表
方法
一、快慢指针移动
判断
首先如何
判断
链表
是否有
环
,这个时候首先需要知道
链表
是否为空,如果不为空,则继续
判断
。 思路:首先定义两个变量,一个fast,一个slow,让fast 每次走两步,slow每次走一步,当fast和slow相遇时,即是该
链表
存在
环
结构。如果该
链表
为无
环
结构,则当遍历完这个
链表
时也不会相遇。即是返回false。 图例如下: 图中为了说明情况, fast指针初始标记为f0,每移动一次加1,如f1,f2,f3… slow指针初始标记为s0,每移动一次加1,如s1
C语言
70,022
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章