Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何检测链表中的循环?

如何检测链表中的循环?

提问于 2017-12-22 06:12:10
回答 2关注 0查看 466

假设你有一个Java链接列表结构。它由节点组成:

代码语言:txt
AI代码解释
复制
class Node {
代码语言:txt
AI代码解释
复制
    Node next;
代码语言:txt
AI代码解释
复制
    // some user data
代码语言:txt
AI代码解释
复制
}

每个节点指向下一个节点,除了最后一个节点,下一个节点为空。说有可能列表可以包含一个循环 - 即最终的节点,而不是一个空,有一个参考列表中的一个节点在它之前。

什么是最好的编写方式

代码语言:txt
AI代码解释
复制
boolean hasLoop(Node first)

true如果给定的节点是带有循环的列表中的第一个,将会返回,false否则返回?你怎么写,以便它需要一个恒定的空间和合理的时间?

回答 2

不知雨

修改于 2017-12-22 06:37:59

你可以利用弗洛伊德的循环寻找算法,也被称为乌龟和兔子算法。

这个想法是有两个引用列表,并以不同的速度移动它们。一个1节点向前移动一个,另一个2节点移动。

如果链表有一个循环,他们一定会见面。

否则两个引用(或他们next)中的任何一个都会变成null。

实现该算法的Java函数:

代码语言:txt
AI代码解释
复制
boolean hasLoop(Node first) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    if(first == null) // list does not exist..so no loop eithe
代码语言:txt
AI代码解释
复制
        return false;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    Node slow, fast; // create two references.
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    slow = fast = first; // make both refer to the start of the list
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    while(true) {
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        slow = slow.next;          // 1 hop
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        if(fast.next != null)
代码语言:txt
AI代码解释
复制
            fast = fast.next.next; // 2 hops
代码语言:txt
AI代码解释
复制
        else
代码语言:txt
AI代码解释
复制
            return false;          // next node null => no loop
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        if(slow == null || fast == null) // if either hits null..no loop
代码语言:txt
AI代码解释
复制
            return false;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        if(slow == fast) // if the two ever meet...we must have a loop
代码语言:txt
AI代码解释
复制
            return true;
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
}

Oxida

发布于 2017-12-22 06:37:03

面是Fast / Slow解决方案的一个改进,它可以正确处理奇数长度的列表并提高清晰度。

代码语言:txt
AI代码解释
复制
boolean hasLoop(Node first) {
代码语言:txt
AI代码解释
复制
    Node slow = first;
代码语言:txt
AI代码解释
复制
    Node fast = first;
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
    while(fast != null && fast.next != null) {
代码语言:txt
AI代码解释
复制
        slow = slow.next;          // 1 hop
代码语言:txt
AI代码解释
复制
        fast = fast.next.next;     // 2 hops 
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
        if(slow == fast)  // fast caught up to slow, so there is a loop
代码语言:txt
AI代码解释
复制
            return true;
代码语言:txt
AI代码解释
复制
    }
代码语言:txt
AI代码解释
复制
    return false;  // fast reached null, so the list terminates
代码语言:txt
AI代码解释
复制
}
和开发者交流更多问题细节吧,去 写回答
相关文章
如何检测链表中是存在循环
  链表在面试中出现的频率很高,有的比较正常,考链表的常规操作,主要看基本功是否扎实,有些就比较难,难在思维的改变和是否能够想到对应的点。这里出现的是其中一个题目,我称之为有环链表问题。也就是从判断一个单链表是否存在循环而扩展衍生的问题。下面来看问题如何解决。   首先来看最基本的这个问题:如何判断一个单链表是否存在循环,链表数目未知。算法不能破坏链表。 思路一:哈希表法 将所有的遍历过的节点用哈希表存储起来,用节点的内存地址作为哈希表的值存储起来。每遍历一个节点,都在这个结构中查找是否遍历过。如果找到有重
陈树义
2018/04/13
2.1K1
如何检测链表中存在的环
链表有环的定义是,链表的尾节点指向了链接中间的某个节点。比如下图,如果单链表有环,则在遍历时,在通过结点J之后,会重新回到结点D。 看了上面的定义之后,如何判断一个单链表是否有环呢? 思路一:快慢指
陈树义
2018/04/13
1.3K0
如何检测链表中存在的环
如何判断循环链表
    实际上判断一个链表是否是循环的思路很简单,困扰我的反而是“带环链表是否就是循环链表”这个问题,穿梭于各中帖子、书本寻找答案终究找不到明确说明。《大话数据结构》中循环链表的定义为:“将单链表中终端节点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表。”也就是这个样子的:
Tencent JCoder
2022/05/06
1.1K0
如何判断循环链表
循环链表的实现_建立双向循环链表
  循环链表是一个收尾相接的链表,将单链表的最后一个指针域改由NULL改为指向表头结点这就是单链式的循环链表,并称为循环单链表
全栈程序员站长
2022/09/20
7710
循环链表的实现_建立双向循环链表
单循环链表-带头双向循环链表的实现
  虽然名字听上去比较复杂单循环链表,但是实现起来比单链表(全名:不带头、不循环、单向链表)更加简单,也不需要过多考虑特殊情况;
宜轩
2022/12/29
6220
循环双向链表的
  需要删除节点p3时就很麻烦,我们需要从头去遍历,找到next指针为p3时将next指针指向p3的next;
杜争斌
2022/04/27
2990
如何判断一个单链表是循环链表
1.循环链表的特点是收尾相接,没有头指针,也没有尾指针。如果去遍历循环链表,则是死循环。
用户4148957
2022/06/14
6540
单循环链表
#!/usr/bin/env python3 # coding=utf-8 class Node: def __init__(self, data): self._data = data self._next = None def set_next(self, node): self._next = node def set_data(self, data): self._data = data def
老高的技术博客
2022/12/28
2100
JS 循环链表
循环链表是一种链表的变体,其中链表中的最后一个节点指向链表的头节点,形成一个循环或环状结构。
肥晨
2023/06/27
2420
循环双链表
双向循环链表 结构图示: 结构体 typedef struct node { int data; struct node* pre; //指向前驱 struct node*
DeROy
2020/05/11
4070
双向循环链表
输入共有三行,第一行为该单向循环链表的长度 n(1≤n≤60);第二行为该单向循环链表的各个元素 ,它们各不相同且都为数字;第三行为一个数字 m,表示链表中的一个元素值,要求输出时以该元素为起点反向输出整个双向链表。
小飞侠xp
2021/05/10
5880
python如何使用for循环_Python 中for循环的应用
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/170074.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/22
7.1K0
【数据结构】线性表 ⑥ ( 双循环链表 | 双循环链表插入操作 | 双循环链表删除操作 | LinkedList 双循环链表源码分析 )
双循环链表 中 , 需要对 插入 / 删除 / 遍历 操作 进行特殊处理 , 因为需要调节 前驱指针 和 后继指针 两个指针 ;
韩曙亮
2023/10/11
2660
【数据结构】线性表 ⑥ ( 双循环链表 | 双循环链表插入操作 | 双循环链表删除操作 | LinkedList 双循环链表源码分析 )
python中for循环加速_如何提高python 中for循环的效率[通俗易懂]
对于某个城市的出租车数据,一天就有33210000条记录,如何将每辆车的数据单独拎出来放到一个专属的文件中呢?
全栈程序员站长
2022/09/22
3.6K0
TencentOS-tiny中双向循环链表的实现及使用
双向链表也是链表的一种,区别在于每个节点除了后继指针外,还有一个前驱指针,双向链表的节点长下面这样:
Mculover666
2020/06/02
1.2K0
TencentOS-tiny中双向循环链表的实现及使用
【数据结构】线性表 ② ( 链式存储结构 - 链表 | 链表分类 - 单链表 / 双链表 / 非循环链表 / 循环链表 | 链表优缺点 )
链式存储结构 ( 链表 ) : 数据 存储在 节点 中 , 每个节点包含 数据值 和 指向下一个节点的指针 ; 通过节点之间的指针关系,可以实现 线性表 数据元素 的连接。
韩曙亮
2023/10/11
4330
Utility之循环链表
与双向链表一样:这个结构内部没有同步或互斥机制。多任务访问同一链表时,要注意互斥保护,例如使用"互斥信号量"。
Taishan3721
2019/12/02
4650
双向循环链表(DoubleLoopLinkList)
双向循环链表 关于双向循环链表可以先阅读这篇文章这里就不再赘述:双向链表(DoubleLinkList) Node template<typename T> class Node { public:
玖柒的小窝
2021/12/15
3450
双向循环链表(DoubleLoopLinkList)
循环链表的增删改查
循环链表与单向链表十分相似,两者唯一不同之处就是,循环链表的尾节点的next属性指向了链表的首节点(非头节点,头节点是没有数据的,头节点的下一个有数据的节点我们称为首节点)。他的表现形式有常见的两种,如下图:
我与梦想有个约会
2023/10/20
1450
循环链表的增删改查
【数据结构】线性表 ④ ( 循环链表 / 单循环链表 | 代码示例 - 使用 Java 实现 单循环链表 )
韩曙亮
2023/10/11
3570

相似问题

如何检测UISwitch中的变化?

2518

2021-03-27:给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位?

0109

如何检测网络?

1182

2021-09-17:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。进阶:你能?

072

如何检测视频中是否有人脸出现?

1673
相关问答用户
腾讯云TDP | TDP会员擅长3个领域
到家集团 | 技术VP擅长5个领域
平安资管 | 架构师擅长4个领域
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文