首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

【数据结构与算法 刷题系列】判断链表是否有环(图文详解)

一、问题描述 原题链接 141. 环形链表 - 力扣(LeetCode) 二、解题思路 1.解题思路: 从环形链表的特点入手——在环中的某个节点,通过next指针连续跟踪可以再次达到。...不过,想要通过比对指针是否循环回到了某个节点,是行不通的,因为无法得知链表是从哪个节点进入环的。...通过快慢指针可以实现判断——慢指针每次走一步,快指针每次走两步 假设存在环的话,快指针会先进环,此时慢指针在环外走了一半; 继续走,当慢指针进环时,快指针已经在环中走了一段时间; 此时快慢指针的相对位置未知...不会存在,因为在环中,快指针每次比慢指针多走一步,两个指针之前的距离每次近一步,在环内,快指针相对于慢指针的“速度差”是恒定的,即使环中只有一个节点,也会相遇 三、代码实现 思路的逻辑比较复杂...不过,代码的实现相对简单 只需要定义两个快慢指针 while循环遍历,快指针每次走两步,慢指针每次走一步 如果快慢指针指向节点相同,则说明链表带环 如果快指针走到NULL,说明链表不带环

11100
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    环形链表

    // 快指针走两步 fast = fast.next.next; } return true; } } 题解分析 利用快慢指针来判断链表是否含环的原理是...:若链表存在环,那么快的指针一定在某时刻遇上慢指针。...题目是让快指针走两步,慢指针走一步,若不存在环的话,两个指针最后都为空,若存在环,则都绕圈,由于步频不一样,最终会相遇,因此当相遇时结束循环返回 true,否则遇到 null 返回 false。...} head = head.next; } return false; } } 题解分析 利用 set 的不可重复的特性,循环将所有节点加入...leetcode原题: 141. 环形链表 点评 leetcode 的提交记录中,方法一执行时间为 0ms 而方法二要 4ms,两者在内存的使用上基本相等,可见双指针效率比较高。

    16130

    单链表习题——快慢指针类习题详解!(2)

    2.2.环形链表 老规矩,先给上链接:141....,快指针往后走两步,然后循环条件还是那个,不过此时我们需要在循环里加上一个if语句,这个语句来判断快慢指针是否相等,如果相等的时候直接返回true,如果循环结束了,直接返回false,读者朋友肯定很好奇小编为什么这么做呢...不要着急,下面听小编娓娓道来:首先,如果这个链表是循环链表的话,快慢指针肯定会相遇的,至于为什么相遇,小编在后面会通过数学推理来给各位解答的!其次,为什么循环结束以后就直接返回flase呢?...这个很简单,如果这个链表不是循环的,那么快指针会直接出链表,不会在返回去,所以如果循环结束了,也就代表着这个链表是不循环的,下面小编先给上图文让各位读者朋友有更好的理解: 先把慢指针和快指针设置好:...,那么很多读者到这里会很好奇为啥这俩就能相遇呢?

    7810

    141. 环形链表

    141. 环形链表 力扣题目链接 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。...为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。...如果链表没环,当快指针走到链表末尾时,直接返回false 。 因为只需要维护两个指针变量,因此空间复杂度是O(1) 。...) return false; fast = fast.next.next; slow = slow.next; } return true; }; 时间复杂度...:O(n) 空间复杂度:O(1) 投机取巧 本题还可以采用JSON的一个特性求解,就是如果对象中存在循环引用,那么执行JSON.stringify()会报错。

    22030

    JavaScript刷LeetCode拿offer-双指针技巧(上)_2023-03-15

    而对于以下情况,只采用单指针处理,则会徒增时间复杂度和空间复杂度: 例如:找到两个数使得它们相加之和等于目标数,采用单指针处理,则需要嵌套循环,使得时间复杂度增长为 O(n^2); 再例如:翻转数组,采用单指针处理...,从而优化空间复杂度; 下面的实战分析会让你感受双指针的威力。...这道题目采用单指针的做法只能通过嵌套循环枚举所有两数之和的方法来解决,时间复杂度为 O(n^2)。   ...利用双指针技巧,则可以在遍历的过程中同时完成交换元素的操作,时间复杂度降低为 O(1): 图片   相同类型的题目还有: 【345. 反转字符串中的元音字母】 四、141....在简单难度中,会介绍该算法的基本知识与实现,另外两个难度,着重讲解解题的思路。

    44740

    JavaScript刷LeetCode拿offer-双指针技巧

    而对于以下情况,只采用单指针处理,则会徒增时间复杂度和空间复杂度:例如:找到两个数使得它们相加之和等于目标数,采用单指针处理,则需要嵌套循环,使得时间复杂度增长为 O(n^2);再例如:翻转数组,采用单指针处理...,从而优化空间复杂度;下面的实战分析会让你感受双指针的威力。...这道题目采用单指针的做法只能通过嵌套循环枚举所有两数之和的方法来解决,时间复杂度为 O(n^2)。  ...利用双指针技巧,则可以在遍历的过程中同时完成交换元素的操作,时间复杂度降低为 O(1):图片  相同类型的题目还有:【345. 反转字符串中的元音字母】四、141....在简单难度中,会介绍该算法的基本知识与实现,另外两个难度,着重讲解解题的思路。  如果本文对您有所帮助,可以点赞或者关注来鼓励博主。

    55930

    JavaScript刷LeetCode之-双指针技巧(上)

    而对于以下情况,只采用单指针处理,则会徒增时间复杂度和空间复杂度:例如:找到两个数使得它们相加之和等于目标数,采用单指针处理,则需要嵌套循环,使得时间复杂度增长为 O(n^2);再例如:翻转数组,采用单指针处理...,从而优化空间复杂度;下面的实战分析会让你感受双指针的威力。...这道题目采用单指针的做法只能通过嵌套循环枚举所有两数之和的方法来解决,时间复杂度为 O(n^2)。  ...利用双指针技巧,则可以在遍历的过程中同时完成交换元素的操作,时间复杂度降低为 O(1):图片  相同类型的题目还有:【345. 反转字符串中的元音字母】四、141....在简单难度中,会介绍该算法的基本知识与实现,另外两个难度,着重讲解解题的思路。  如果本文对您有所帮助,可以点赞或者关注来鼓励博主。

    44060

    双指针技巧直接秒杀五道算法题

    学算法认准 labuladong 后台回复进群一起刷力扣 读完本文,可以去力扣解决如下题目: 141.环形链表(Easy) 141.环形链表II(Medium) 167.两数之和 II - 输入有序数组...1、判定链表中是否含有环 这属于链表最基本的操作了,学习数据结构应该对这个算法思想都不陌生。 单链表的特点是每个节点只知道下一个节点,所以一个指针的话无法判断链表中是否含有环的。...= null) head = head.next; return false; } 但是如果链表中含有环,那么这个指针就会陷入死循环,因为环形数组中没有null指针作为尾部节点...这是为什么呢?...说句题外话,之前还有读者争论为什么是环长度整数倍,我举个简单的例子你就明白了,我们想一想极端情况,假设环长度就是 1,如下图: 那么fast肯定早早就进环里转圈圈了,而且肯定会转好多圈,这不就是环长度的整数倍嘛

    30710

    常见编程模式之快慢指针

    这种方法对于处理「环形」链表或数组非常有用。以链表为例,通过以不同的速度移动,我们可以证明如果链表中存在环,则两个指针必定会相遇,当两个指针均处在环中时,快指针会追上慢指针(如下图所示)。 ?...在以下场景中,我们可能会用到快慢指针: 题目涉及包含「循环」的链表或数组 需要求解链表中某个元素的位置或链表长度 快慢指针和双指针比较类似(可以理解为特殊的双指针法),在只能单向移动的数据结构中(如单向链表...经典例题 141. 环形链表(Easy) 给定一个链表,判断链表中是否有环。...,则两者必然会在某一时间点相遇。...根据定义,循环的长度必须大于 1 。 这道题可以通过快慢指针法解决。由于题目明确数组元素不为 0,我们可以通过将元素置 0 来标记已经遍历过的元素,以减少时间复杂度。

    5K30

    【算法】213-每周一练 之 数据结构与算法(LinkedList)

    所以,链表允许插入和删除表上任意位置上的节点,但是不允许随即存取。链表有很多种不同的类型:单向链表、双向链表及循环链表。...数组寻找某个元素较为简单,但插入与删除比较复杂,由于最大长度需要再编程一开始时指定,故当达到最大长度时,扩充长度不如链表方便。...假设 n 是列表的长度,那么时间复杂度为 O(n)。 空间复杂度: O(n)。 由于使用递归,将会使用隐式栈空间。递归深度可能会达到 n 层。...解题思路1.判断是否有 null: 一直遍历下去,如果遍历到 null 则表示没有环,否则有环,但是考虑到性能问题,最好给定一段时间作为限制,超过时间就不要继续遍历。...---- 解析: 题目出自:[Leetcode 141.

    63330

    Leetcode 【287、1035】

    Find the Duplicate Number 解题思路: 这道题由于 Note 中有很多限制,想到的一些方法(如排序后再找、开辟 O(n) 空间计数、双循环)都不满足题意。...我们已经知道,判断一个链表是否有环可以像 Leetcode 【Two Pointers】141. Linked List Cycle 那样,使用快慢指针。...此时,他们相遇的节点即是链表环的入口(这个问题的证明留到我做 142 题时再写)。 那么回到 287 这道题。...我们只需要构造出类似于 142 题的“链表”,然后使用上述方法就可以找到重复的那个数字(即环的入口)。...那么就会得到如下的有向循环图: ? 从这里看出来 3,4,2形成了一个环,而环的入口点是 3,这个问题就转换成了 Leetcode 142 的问题了。

    51530

    HashMap 这一篇就够了

    当同一个索引位置的节点在新增后达到9个(阈值8):如果此时数组长度大于等于 64,则会触发链表节点转红黑树节点(treeifyBin);而如果数组长度小于64,则不会触发链表转红黑树,而是会进行扩容,因为此时的数据量还比较小...对于移除,当同一个索引位置的节点在移除后达到 6 个,并且该索引位置的节点为红黑树节点,会触发红黑树节点转链表节点(untreeify)。 二狗:为什么链表转红黑树的阈值是8?...二狗:(呦呦呦,时间和空间上权衡的结果,还装起B来了)那为什么转回链表节点是用的6而不是复用8?...HashMap 的容量有什么限制吗? 囧辉:默认初始容量是16。...二狗:为什么是0.75而不是其他的? 囧辉:(又问这种憨逼问题)这个也是在时间和空间上权衡的结果。

    1K20

    搞定大厂算法面试之leetcode精讲7.双指针

    复杂度分析:时间复杂度O(n),n是链表的数量,最差的情况下每个节点都要遍历。...,slow指针初始也指向head,每次循环向前走一步,fast指针初始指向head,每次循环向前两步,如果没有环,则快指针会抵达终点,如果有环,那么快指针会追上慢指针 复杂度:时间复杂度O(n),空间复杂度...减少一层循环,时间复杂度O(n^2),空间复杂度O(n)。...,链表A循环结束就循环链表B,链表A循环结束就循环链表B,当pA == pB时就是交点,因为两个指针移动的步数一样 复杂度:时间复杂度O(m+n),m、n分别是两个链表的长度。...headB : pA.next;//链表A循环结束就循环链表B pB = pB === null ?

    31940

    LeetCode通关:听说链表是门槛,这就抬脚跨门而入

    循环链表 循环链表,就是最后一个节点的后继指向头结点,头节点的前驱指向最后一个节点。 ? 链表的存储方式 我们知道链表在内存中不是连续分配的。链表是通过指针域的指针链接内存中的各个节点。...链表基本操作的图示在前面已经给出了。 比较简练的方式是设置一个伪头节点,保证链表永不为空,这样操作起来会方便很多。 但是,我本人看过一点Java链表的代码,所以不想采用这种方式。...环形链表 题目:141. 环形链表 (https://leetcode-cn.com/problems/linked-list-cycle/) 难度:简单 描述: 给定一个链表,判断链表中是否有环。...代码如下: /** * @return boolean * @Description: 141....说明:不允许修改给定的链表。 进阶: 你是否可以使用 O(1) 空间解决此题? ? 思路: 这道题,乍一看,是 141. 环形链表 的进阶,仔细一看,没那么简单。 141.

    43820

    马上2021年了线性表你还不知道原理?给老王整的明明白白

    我们再增加一个指向上一个结点的指针,这样就得到了双向链表 ? 当然了,还有更好的办法,那就是把循环链表和双向链表进行结合就得到了双向循环链表。 ?...不管是循环链表还是双向链表,还是双向循环链表,都是在单向链表的基础上加以改造得到的,改造后的链表在操作某种数据的时候可以提高一定的效率,所以单向链表是基础。...我们先不管如何插入到链表中的,先看图说话。 老王如果想插队必定插入到小明的后面,因为老王在插队的过程中小明此时可能会正在取票呢。 那么插入老王后的数据就是: ?...在链表中的查找功能是比较弱的,对于链表中的查找,唯一的办法就是一个挨着一个的遍历去对比,对比较着去查找。 时间复杂度也就是O(N)。...1、题目描述 141.

    37531

    算法一招鲜——双指针问题

    什么是双指针(对撞指针、快慢指针) 双指针,指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。...对撞数组适用于有序数组,也就是说当你遇到题目给定有序数组时,应该第一时间想到用对撞指针解题 伪代码大致如下: function fn (list) { var left = 0; var right...以LeetCode 141.环形链表为例,,判断给定链表中是否存在环,可以定义快慢两个指针,快指针每次增长一个,而慢指针每次增长两个,最后两个指针指向节点的值相等,则说明有环。...就好像一个环形跑道上有一快一慢两个运动员赛跑,如果时间足够长,跑地快的运动员一定会赶上慢的运动员。 解题代码如下: /** * Definition for singly-linked list....nums[slow] = nums[fast]; } } return slow + 1; }; 总结 当遇到有序数组时,应该优先想到双指针来解决问题,因两个指针的同时遍历会减少空间复杂度和时间复杂度

    90630
    领券