环形链表Ⅰ(简单难度)

简介: 环形链表Ⅰ(简单难度)

题目概述(简单难度)

给定一个链表,判断链表中是否有环。


如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。 如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。


如果链表中存在环,则返回 true 。 否则,返回 false 。


进阶:


你能用 空间复杂度O(1)解决此问题吗?


示例 1:

2.png


输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点。


示例 2:

2.png

输入:head = [1,2], pos = 0
输出:true
解释:链表中有一个环,其尾部连接到第一个节点。

示例 3:

2.png


输入:head = [1], pos = -1
输出:false
解释:链表中没有环。


附上leetcode链接:

点击此处进入leetcode


思路与代码

思路展现

这道题目同样运用的是我们的经典思路快慢指针

思路是这样的:

1:首先定义快指针fast和慢指针slow分别指向我们的头节点

2:fast指针一次走两步,slow指针一次都一步,如果链表有环,那么slow指针和fast指针按照这样的走法终会相遇.无环返回false即可,有环返回true.

3:此题目是贝壳之前的面试题目,假设此时fast不走两步,每次走了三步甚至四步,这道题目还能有解吗?

答案当然是不,原因是我们的fast指针如果每次走三步甚至是四步的话,他跟slow指针很可能永远都相遇不了.


代码示例

public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null){
            return false;
        }
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null&&fast.next!=null){
                fast=fast.next.next;
                slow=slow.next;
                //判断fast和slow是否相遇
                if(fast==slow){
                    return true;
                }
        }
        return false;
    }
}

总结

1:此算法

时间复杂度O(N):不管是链表是否有环,在最坏情况下,fast指针和slow指针终会遍历链表一遍,N为链表中节点个数,所以时间复杂度为O(N).

空间复杂度O(1):每次fast指针和slow指针都会被重新赋值,只占用一次空间,所以空间复杂度为O(1).

2:对于快慢指针这种题目还需要好好斟酌,前面我们也有用到快慢指针的思路,希望大家好好复习。


相关文章
|
7月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
6月前
|
Java
环形数组链表(java)
环形数组链表(java)
|
2月前
【数据结构】环形、相交、回文、分割、合并、反转链表
【数据结构】环形、相交、回文、分割、合并、反转链表
29 0
|
5月前
【数据结构OJ题】环形链表
力扣题目——环形链表
38 3
【数据结构OJ题】环形链表
|
5月前
【数据结构OJ题】环形链表II
力扣题目——环形链表II
34 1
【数据结构OJ题】环形链表II
|
6月前
|
存储 算法 Java
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
【经典算法】Leetcode 141. 环形链表(Java/C/Python3实现含注释说明,Easy)
60 2
|
5月前
|
Java 索引
力扣经典150题第五十六题:环形链表
力扣经典150题第五十六题:环形链表
35 0
|
7月前
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点.
<数据结构>五道LeetCode链表题分析.环形链表,反转链表,合并链表,找中间节点
53 1
|
7月前
|
存储 算法 索引
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
【力扣刷题】只出现一次的数字、多数元素、环形链表 II、两数相加
55 1
|
6月前
|
Java
单向环形链表-约瑟夫问题(java)
单向环形链表-约瑟夫问题(java)