LeetCode 141题:环形链表的艺术与科学

LeetCode 141题:环形链表的艺术与科学

🌟 LeetCode 141题:环形链表的艺术与科学

因为想更好地为义父义母大佬服务,本文 Bilibili 视频地址

🌀 环形链表:当数据开始循环舞蹈

在计算机科学的世界里,链表是一种优雅而基础的数据结构。正常链表如同一条笔直的小路,从起点(head)出发,每个节点指向下一个节点,最终以空指针(nullptr)作为终点,标志着旅程的结束。

Head

Node1

Node2

Node3

nullptr

然而,环形链表则打破了这种线性规则,它更像是一个神秘的莫比乌斯环,没有真正的终点。链表的某个节点不再指向空,而是指向链表中已经存在的另一个节点,形成了一个无尽的循环。

Head

Node1

Node2

Node3

Node4

🔍 解法一:哈希表法 - 记忆的艺术

解题思路

想象你是一位侦探,正在追踪一个可能陷入循环的线索。你需要记录下每一个经过的节点,就像在犯罪地图上钉上标记。每当遇到新节点时,你都要检查这个地点是否曾经出现过。

boolhasCycle(ListNode *head){ unordered_set<ListNode*> visited;while(head !=nullptr){if(visited.count(head)){returntrue;// 发现重复访问,存在环} visited.insert(head); head = head->next;}returnfalse;// 正常到达终点,无环}

性能分析

指标说明
时间复杂度O(n)最坏情况需要遍历整个链表
空间复杂度O(n)需要存储所有访问过的节点

这种方法直观易懂,但需要额外的存储空间。哈希表的选择至关重要,它决定了查找效率。在C++中,unordered_set提供了平均O(1)的查找时间复杂度。

🏃‍♂️ 解法二:快慢指针法 - 龟兔赛跑的智慧

解题思路

受龟兔赛跑寓言的启发,我们让两个指针以不同速度遍历链表。如果存在环,快指针终将追上慢指针;如果不存在环,快指针会先到达终点。

指针移动

Head

Node1

Node2

Node3

Node4

slow

fast

boolhasCycle(ListNode *head){if(head ==nullptr|| head->next ==nullptr){returnfalse;} ListNode* slow = head; ListNode* fast = head->next;while(slow != fast){if(fast ==nullptr|| fast->next ==nullptr){returnfalse;// 快指针到达终点,无环} slow = slow->next;// 乌龟每次一步 fast = fast->next->next;// 兔子每次两步}returntrue;// 相遇,存在环}

性能优势

指标说明
时间复杂度O(n)线性时间解决问题
空间复杂度O(1)仅需两个指针,常数空间

这种方法不需要额外存储空间,是空间最优解。它体现了计算机科学中常见的双指针技巧,广泛应用于链表相关问题。

💻 代码实现与调试心得

在力扣平台上实现时,有几个关键点需要注意:

  1. 边界条件处理:空链表或单节点链表直接返回false
  2. 指针移动顺序:先移动指针再判断,避免错过相遇点
  3. 循环终止条件:快指针或其next为null时即可确定无环

调试过程中,我最初忽略了fast->next的判空,导致在偶数长度链表上报错。通过添加这个检查,代码变得更加健壮。

🌈 思维与实现的分离

在解决算法问题时,思维过程具体实现是两个不同的层面:

  1. 思维层面:考虑问题本质,寻找规律和模式
  2. 实现层面:将思维转化为代码,处理边界条件和语言特性

优秀的程序员能够在这两个层面间自如切换,既能看到森林,也能处理每棵树。

🎯 总结

环形链表判断是链表操作中的经典问题,两种解法各有千秋:

  • 哈希表法:直观易懂,适合教学和理解问题本质
  • 快慢指针法:空间高效,体现了算法优化的智慧
 LeetCode 141题:环形链表的艺术与科学

掌握这两种方法,不仅能解决LeetCode 141题,更能为处理更复杂的链表问题打下坚实基础。记住,在编程的世界里,有时候跑得快的兔子确实能教会我们很多!

Read more

数据结构:⼆叉树(1)

数据结构:⼆叉树(1)

目录 前言  树部分知识: 一.树的概念和结构 二.树的一些相关术语和定义  三.树的实现结构(了解部分) 四、树的应用场景 二叉树部分知识讲解: 一.二叉树概念与结构 二.特殊二叉树类型 1.满二叉树 2.完全二叉树 3.性质补充 三、⼆叉树存储结构 顺序结构: 编辑应用: 链式结构: 四、堆的概念与结构 1.实现顺序结构⼆叉树: 2.堆的概念与结构 (重点) 3.堆的实现 五、堆的实现代码部分 1.堆的初始化:(本次实现选取大堆为例) 2.堆的销毁: 3.堆的插入数据 : 4.堆打印值 : 六、

By Ne0inhk
InChIKey: 分子的“化学身份证”,从哈希原理到全球监管合规(2025)

InChIKey: 分子的“化学身份证”,从哈希原理到全球监管合规(2025)

InChI 和 InChIKey 已成为全球科学家不可或缺的工具,为化学领域提供了一种新的通用语言。这些工具的强大功能使化学家和计算机能够更有效地沟通,从而加快科学研究的步伐。 以下是 【InChIKey】深度实战指南:从哈希原理到全球监管合规(2025) 的完整技术文章。 全文严格遵循您此前确认的结构范式(起源、生成逻辑、结构解析、碰撞分析、真实案例、Python实操、适用清单、避坑指南、生态支持、一键复现),所有内容基于: ✅ IUPAC InChI Trust 官方文档 v1.09(2024.11 发布) ✅ NIST Chemistry WebBook 2025.3 实测数据库(含全部已知碰撞对) ✅ RDKit 2024.9 / Open Babel 3.1.0 / ChemDraw

By Ne0inhk
【Linux篇章】再续传输层协议TCP:用技术隐喻重构网络世界的底层逻辑,用算法演绎‘网络因果律’的终极推演(通俗理解TCP协议,这一篇就够了)!

【Linux篇章】再续传输层协议TCP:用技术隐喻重构网络世界的底层逻辑,用算法演绎‘网络因果律’的终极推演(通俗理解TCP协议,这一篇就够了)!

📌本篇摘要 * 本篇将根据TCP协议报文的格式来对TCP更深入的了解,学习它的三次握手,四次挥手,滑动窗口等等,到最后能更加深入理解之前写TCP通信的时候,底层到底是如何进行的,读完本篇将会对之前TCP网络通信编程有更深入的认识。 🏠欢迎拜访🏠:点击进入博主主页 📌本篇主题📌:再续TCP协议 📅制作日期📅:2025.12.20 🧭隶属专栏🧭:点击进入所属Linux专栏 一.TCP协议格式 -TCP 全称为 传输控制协议(Transmission Control Protocol). 人如其名, 要对数据的传输进行一个详细的控制。 下面看TCP报文的格式: 下面我们来一个个介绍下这些字段及作用: 1. 🔍十六位窗口大小 * 这里我们知道对于tcp来说,如果接收缓冲区满了,再发送机会被丢弃,因此发送前需要知道对的的接收缓冲区的剩余长度。 * 按量按需发送,必须知道对方的接受缓冲区中剩余空间的大小,因此每次发送的tcp报文都要带有自己剩余接收缓冲区的长度! 2.🔍4位首部长度 * 首先我们要知道tcp光报头就至少20字节(不包含

By Ne0inhk