如何检测链表中是存在循环
链表在面试中出现的频率很高,有的比较正常,考链表的常规操作,主要看基本功是否扎实,有些就比较难,难在思维的改变和是否能够想到对应的点。这里出现的是其中一个题目,我称之为有环链表问题。也就是从判断一个单链表是否存在循环而扩展衍生的问题。下面来看问题如何解决。
首先来看最基本的这个问题:如何判断一个单链表是否存在循环,链表数目未知。算法不能破坏链表。
思路一:哈希表法
将所有的遍历过的节点用哈希表存储起来,用节点的内存地址作为哈希表的值存储起来。每遍历一个节点,都在这个结构中查找是否遍历过。如果找到有重复,则说明该链表存在循环。如果直到遍历结束,则说明链表不存在循环。哈希表中存储的值为节点的内存地址,这样查找的操作所需时间为O(1),遍历操作需要O(n),hash表的存储空间需要额外的O(n)。所以整个算法的时间复杂度为O(n),空间复杂度为O(n)。
思路二:反转指针法
这种比较特别,是使用反转指针的方法,每过一个节点就把该节点的指针反向。当有环的时候,最后指针会定位到链表的头部,如果到最后,都没有再到头部,那说明链表不存在循环。这个方法会破坏掉链表,所以如果要求是不能破坏链表的话,我们最后就还需要反转一下,再将链表恢复(题目说不能破坏环,那我破坏之后恢复原样也算没破坏环呀。哈哈,思路不要被局限住了)。这个方法使用的空间复杂度为O(1),其实是使用了3个指针,用于进行反转。同时,时间复杂度为O(n)。
思路三:快慢指针(是错的!)
首先我们要理解什么是快慢指针。快指针pf(f就是fast的缩写)每次移动2个节点,慢指针ps(s为slow的缩写)每次移动1个节点,如果快指针能够追上慢指针,那就说明其中有一个环,否则不存在环。
这个方法的时间复杂度为O(n),空间复杂度为O(1),实际使用两个指针。
想像一种情况,当快指针走到一个环的时候,慢指针还离快指针很远,甚至当快指针走出环的时候慢指针还没到达环,这时候快指针永远不会追上慢指针。所以快慢指针无法解决链表存在循环的问题,快慢指针能解决的只是链表存在环的问题,也就是这个循环在链表尾部。可以说链表存在环是链表存在循环的一种特殊情况。
转载于:https://www.cnblogs.com/chanshuyi/p/5314391.html
如何检测链表中是存在循环相关推荐
- 如何检测链表中的循环?
假设您在Java中有一个链表结构. 它由节点组成: class Node {Node next;// some user data } 每个节点都指向下一个节点,但最后一个节点除外,后者的下一个为空. ...
- python代码检测链表中的环并删除环
python代码检测链表中的环并删除环 在计算机科学中,链表是数据元素的线性集合,其顺序不是由它们在内存中的物理位置决定的.相反,每个元素指向下一个元素.它是一种数据结构,由一组节点组成,这些节点共同 ...
- 检测图中的负循环 | (贝尔曼福特)
我们得到了一个有向图.我们需要计算图形是否有负循环.负循环是循环的总和变为负的循环. 在图形的各种应用中都可以找到负权重.例如,如果我们沿着这条路走,我们可能会得到一些好处,而不是为一条路付出代价. ...
- 写出一段代码将链表中的两个节点位置互换位置_干货||链表的技巧和算法总结...
链表的操作总结 链表反转 这是一个简单的链表操作问题,在leetcode上面有52.7%的通过率,难度是简单.但是还是想在这里基于python做一下总结,顺便总结一下链表的各种操作. 首先先看一下 ...
- 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)
接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...
- 判断单链表中的元素是否递增_检测单链表中是否有环(C语言)
检测单链表中是否有环(C语言) 方法:双指针法思路 使用两个指针,两个初始时都指向链表的头结点,然后one指针一次加一,另一个two指针一次加二. 在链表有环时,two指针与one指针相等就说明有环. ...
- 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最
[问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...
- lua检测表中是否有某个值_Lua基础知识总结(入职面试题)
2019年8月刚入职新公司时,因为之前的项目都没有使用lua的经验,所以jojo老大出了一份题让我想尽办法找出答案,当时对于一个无经验的小菜鸟来说,属实费了不少功夫,如今分享出来,希望能对刚使用lua ...
- 单链表中倒数第K个结点
单链表中倒数第K个结点 链表结点定义如下: typedef int ElemType;typedef struct Node {ElemType data; struct Node *next; }H ...
最新文章
- HDU2034(set的应用)
- JAVA中对日期格式的处理
- python写文件读文件-Python 实例:读写文件
- python代码大全p-21行Python代码实现拼写检查器
- 数字密码输入框对输入内容进行隐藏
- ubuntu16.04更改python版本
- 点亮led灯的个数_点亮一个led灯程序
- macOS升级到Big Sur之后Goland提示找不到svn命令
- 汇编Masm更改颜色
- 地理加权回归学习记录
- POI导出Excel设置自适应列宽
- 如何和后台接触的_民熔小课堂|跌落式熔断器该如何检修?点进来告诉你答案!...
- C++:pass by reference的时候真正传递的是什么?
- Android属性(android:gravity)的说明
- 开源,阿里内部Spring Cloud Alibaba微服务神仙文档(全彩版)
- 欧洲家具EN 597-1 跟EN 597-2两个阻燃标准一样吗?
- 打破空间探索边界:曲速引擎或将实现超光速
- 轻松搞定PMP考试的计算题(二)快速弄懂折旧计算
- 微型计算机杂志16期,微型计算机
- 敬业签桌面便签怎么设置桌面固定?