141.环形链表


题目:141.环形链表

给你一个链表的头节点 head ,判断链表中是否有环。

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

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

  • 示例 1:

环形链表

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

环形链表

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

环形链表

输入:head = [1], pos = -1
输出:false
解释:链表中没有环。
  • 提示:
链表中节点的数目范围是 [0, 10^4]
-10^5 <= Node.val <= 10^5
pos 为 -1 或者链表中的一个 有效索引 。
  • 进阶:
进阶:你能用 O(1)(即,常量)内存解决此问题吗?

思路

判断链表中是否存在环,可以使用快慢指针(也叫龟兔赛跑算法)。这是一个非常经典的算法,用于检测链表中的环。

  1. 初始化快慢指针:我们用两个指针,slowfastslow 每次移动一步,fast 每次移动两步。

  2. 移动指针:在遍历链表时,slow 指针一次移动一格,fast 指针一次移动两格。

  3. 判断环的存在:如果链表中有环,slowfast 指针最终会在某个节点上相遇(即指向同一个节点)。如果 fast 指针遇到 null(即链表尾部),则说明链表中没有环。

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)

代码

public boolean hasCycle(ListNode head) {
    // 定义快慢指针
    ListNode slow = head;
    ListNode fast = head;
    // 遍历链表,直到快指针或快指针的下一个节点为空
    while (fast != null && fast.next != null) {
        slow = slow.next;
        fast = fast.next.next;
        // 如果快慢指针相遇,说明链表中有环
        if (slow == fast) {
            return true;
        }
    }
    return false;
}

文章作者: cxyexe
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 cxyexe !
  目录