链表在面试中出现的频率很高,有的比较正常,考链表的常规操作,主要看基本功是否扎实,有些就比较难,难在思维的改变和是否能够想到对应的点。这里出现的是其中一个题目,我称之为有环链表问题。也就是从判断一个单链表是否存在循环而扩展衍生的问题。下面来看问题如何解决。
  首先来看最基本的这个问题:如何判断一个单链表是否存在循环,链表数目未知。算法不能破坏链表。

思路一:哈希表法

将所有的遍历过的节点用哈希表存储起来,用节点的内存地址作为哈希表的值存储起来。每遍历一个节点,都在这个结构中查找是否遍历过。如果找到有重复,则说明该链表存在循环。如果直到遍历结束,则说明链表不存在循环。哈希表中存储的值为节点的内存地址,这样查找的操作所需时间为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

如何检测链表中是存在循环相关推荐

  1. 如何检测链表中的循环?

    假设您在Java中有一个链表结构. 它由节点组成: class Node {Node next;// some user data } 每个节点都指向下一个节点,但最后一个节点除外,后者的下一个为空. ...

  2. python代码检测链表中的环并删除环

    python代码检测链表中的环并删除环 在计算机科学中,链表是数据元素的线性集合,其顺序不是由它们在内存中的物理位置决定的.相反,每个元素指向下一个元素.它是一种数据结构,由一组节点组成,这些节点共同 ...

  3. 检测图中的负循环 | (贝尔曼福特)

    我们得到了一个有向图.我们需要计算图形是否有负循环.负循环是循环的总和变为负的循环. 在图形的各种应用中都可以找到负权重.例如,如果我们沿着这条路走,我们可能会得到一些好处,而不是为一条路付出代价. ...

  4. 写出一段代码将链表中的两个节点位置互换位置_干货||链表的技巧和算法总结...

    链表的操作总结   链表反转 这是一个简单的链表操作问题,在leetcode上面有52.7%的通过率,难度是简单.但是还是想在这里基于python做一下总结,顺便总结一下链表的各种操作. 首先先看一下 ...

  5. 数据结构初阶(4)(OJ练习【判断链表中是否有环、返回链表入口点、删除链表中的所有重复出现的元素】、双向链表LinkedList【注意事项、构造方法、常用方法、模拟实现、遍历方法、顺序表和链表的区别)

    接上次博客:数据结构初阶(3)(链表:链表的基本概念.链表的类型.单向不带头非循环链表的实现.链表的相关OJ练习.链表的优缺点 )_di-Dora的博客-CSDN博客 目录 OJ练习 双向链表--Li ...

  6. 判断单链表中的元素是否递增_检测单链表中是否有环(C语言)

    检测单链表中是否有环(C语言) 方法:双指针法思路 使用两个指针,两个初始时都指向链表的头结点,然后one指针一次加一,另一个two指针一次加二. 在链表有环时,two指针与one指针相等就说明有环. ...

  7. 【问题描述】在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素。【输入形式】循环输入若干个整数,以字母结束输入,建立带头结点的单链表。【输出形式】输出最

    [问题描述] 在带头结点单链表中查找最大值,将其值与最后一个元素交换,输出交换后的单链表各元素. [输入形式] 循环输入若干个整数,以字母结束输入,建立带头结点的单链表. [输出形式] 输出最大值与最 ...

  8. lua检测表中是否有某个值_Lua基础知识总结(入职面试题)

    2019年8月刚入职新公司时,因为之前的项目都没有使用lua的经验,所以jojo老大出了一份题让我想尽办法找出答案,当时对于一个无经验的小菜鸟来说,属实费了不少功夫,如今分享出来,希望能对刚使用lua ...

  9. 单链表中倒数第K个结点

    单链表中倒数第K个结点 链表结点定义如下: typedef int ElemType;typedef struct Node {ElemType data; struct Node *next; }H ...

最新文章

  1. HDU2034(set的应用)
  2. JAVA中对日期格式的处理
  3. python写文件读文件-Python 实例:读写文件
  4. python代码大全p-21行Python代码实现拼写检查器
  5. 数字密码输入框对输入内容进行隐藏
  6. ubuntu16.04更改python版本
  7. 点亮led灯的个数_点亮一个led灯程序
  8. macOS升级到Big Sur之后Goland提示找不到svn命令
  9. 汇编Masm更改颜色
  10. 地理加权回归学习记录
  11. POI导出Excel设置自适应列宽
  12. 如何和后台接触的_民熔小课堂|跌落式熔断器该如何检修?点进来告诉你答案!...
  13. C++:pass by reference的时候真正传递的是什么?
  14. Android属性(android:gravity)的说明
  15. 开源,阿里内部Spring Cloud Alibaba微服务神仙文档(全彩版)
  16. 欧洲家具EN 597-1 跟EN 597-2两个阻燃标准一样吗?
  17. 打破空间探索边界:曲速引擎或将实现超光速
  18. 轻松搞定PMP考试的计算题(二)快速弄懂折旧计算
  19. 微型计算机杂志16期,微型计算机
  20. 敬业签桌面便签怎么设置桌面固定?

热门文章

  1. 【设计】线框图、原型和视觉稿的区别
  2. Android学习之Shared Preference
  3. 20120621第一天_复习与测试
  4. HTML在手机上实现直接拨打电话以及发送短信
  5. SQL中Truncate的用法
  6. 对图片对比度和亮度的理解
  7. PHP解析URL并得到URL中的参数
  8. 观后感,读了几篇博文
  9. element ui 组件踩坑记录--后台管理系统-最全
  10. 8bit黑白图像的灰度值范围是_浅谈工业CT图像灰度值