【每天学习一点算法 2025/12/15】环形链表

每天学习一点算法 2025/12/15

题目:环形链表

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

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

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

  1. 首先想到的方法就是用Map存储节点,如果遇到重复的节点说明有环。

    typescript 复制代码
    function hasCycle(head: ListNode | null): boolean {
      if (!head || !head.next) return false;
    
      const map = new Map();
      while (head) {
        if (map.has(head.next)) return true;
        map.set(head, head.val);
        head = head.next;
      }
      return false;
    };
  2. 「Floyd 判圈算法」(又称龟兔赛跑算法)、

    Floyd 判圈算法(Floyd's Tortoise and Hare Algorithm)是一种空间复杂度为 O (1) 的算法,用于检测链表、迭代序列等结构中是否存在环,并能找到环的入口点,核心思想是通过快慢指针的移动规律来判断环的存在。

    • 定义两个指针:慢指针(龟)每次移动 1 步,快指针(兔)每次移动 2 步。
    • 若结构中无环:快指针会先到达终点(如链表的 null)。
    • 若结构中有环:快慢指针最终会在环内某个节点相遇(因为快指针在环内 "追赶" 慢指针,且步长差为 1,必然会追上)。
    typescript 复制代码
    function hasCycle(head: ListNode | null): boolean {
      if (!head || !head.next) return false;
    
      let slow: ListNode | null = head;
      let fast: ListNode | null = head.next;
      while (slow !== fast) {
        if (!fast || !fast.next) return false;
        slow = slow?.next || null;
        fast = fast.next.next;
      }
      return true;
    }

题目来源:力扣(LeetCode)

相关推荐
UIU1149 分钟前
P16237 [蓝桥杯 2026 省 B] 应急布线
数据结构·c++·算法·蓝桥杯
旖旎夜光12 分钟前
LeetCode 315: 算右侧小于当前元素的个数(归并排序) —— 题解
c++·学习·算法·leetcode·排序算法
像风一样自由202021 分钟前
2.如何用FastAPI把一个Python算法封装成HTTP服务
python·算法·fastapi
D e re k ZH27 分钟前
保序回归:从 PAVA 到可并堆的单调约束优化
c++·算法·数据挖掘·回归·kotlin
青少儿编程课堂28 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:字典树前缀树与单词检索统计
c++·python·算法·bfs·信息学竞赛
Nuanyt32 分钟前
LeetCode Hot 100 链表专题2 3 题 (Java)
java·笔记·算法·leetcode·链表
海绵宝宝转agent1 小时前
LeetCodehot100题解
java·笔记·学习·算法·leetcode·深度优先
青少儿编程课堂1 小时前
2026蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级:堆排序与优先队列解析
c++·python·算法·bfs·信息学竞赛
芒果作者1 小时前
我决定系统学习 Codex,并建立一套自己的知识库
学习
SZYSK2 小时前
OpenHarmony 上读卡、推理和双屏刷新抢 CPU:核验机与消费机的调度差
物联网·算法·harmonyos·1024程序员节