当前位置: 首页 > news >正文

【LeetCode 141】算法:环形链表

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

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

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

image


要判断链表中是否有环,可以使用快慢指针法。这个方法利用两个指针,一个每次移动一步(慢指针),另一个每次移动两步(快指针)。如果链表中存在环,那么快指针最终会追上慢指针,即两个指针会在环内某处相遇。这种方法简单且高效,适用于大多数需要检测链表环的场景。

算法步骤:

  1. 初始化:设置两个指针 slow 和 fast,都指向链表的头节点 head。

  2. 移动指针:在链表未结束的条件下,移动 slow 和 fast 指针。slow 每次移动一步,fast 每次移动两步。

  3. 检查相遇:如果 fast 或 fast.next 为 null,则说明链表无环,返回 false。

  4. 发现环:如果 slow 和 fast 相遇(即 slow == fast),则说明链表有环,返回 true。

复杂度分析:

  • 时间复杂度:O (n),其中 n 是链表的长度。在最坏的情况下,快指针需要遍历整个链表才能找到环或到达链表末尾。

  • 空间复杂度:O (1),只需要两个指针,所以额外空间复杂度是常数级别的。

我的 Java 代码:

/*** Definition for singly-linked list.* class ListNode {*     int val;*     ListNode next;*     ListNode(int x) {*         val = x;*         next = null;*     }* }*/
public class Solution {public boolean hasCycle(ListNode head) {if(head==null || head.next==null){return false;}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;  // 链表无环}
}
http://www.sczhlp.com/news/668.html

相关文章:

  • 暑训#3补题
  • 关于跨域的一点新理解
  • js基础第三天
  • 龙哥量化:股票期货- 精华资料目录
  • 2025省选组合数学笔记
  • 字符串
  • js基础第四天
  • 同时点亮LED、数码管以及点阵
  • 今日总结
  • docker安装
  • 二进制简史:从理论到芯片
  • Qcom dcvs_epss.c 驱动解析.
  • AirSim+PX4+QGC实现无人机自动避障
  • js基础第五天
  • 简单了解高阻抗(High-Z)
  • 中台建设为什么需要领域驱动设计
  • 不同Linux发行版Node安装指南
  • 虚化引擎游戏解包工具
  • hyper-v安装manjaro虚拟机
  • spring-data-JPA代码审计
  • 小作业 7(5 道不等式练习题)
  • CF2128F Strict Triangle
  • Dubbo
  • AWS上实现超大规模模型训练的近线性扩展
  • 现代Web服务器性能革命:我的Rust框架探索之旅(6906)
  • Hyperlane性能调优秘籍:从毫秒级响应到百万QPS的优化之路(0548)
  • 实时通信协议的Rust实现(4131)
  • Rust生态系统在Web开发中的优势(9336)
  • TCP连接优化的实战经验(3008)
  • 高并发处理的Rust实现方案(6871)