🌈hello,你好鸭,我是Ethan,一名不断学习的码农,很高兴你能来阅读。
✔️目前博客主要更新Java系列、项目案例、计算机必学四件套等。
🏃人生之义,在于追求,不在成败,勤通大道。加油呀!
🔥个人主页:Ethan Yankang
🔥推荐:史上最强八股文 || 一分钟看完我的上千篇博客
🔥温馨提示:划到文末发现专栏彩蛋 点击这里直接传送
🔥本篇概览:数据结构与算法 || 详细讲解了利用哈希表求解环形链表的入环节点。🌈⭕🔥
【计算机领域一切迷惑的源头都是基本概念的模糊,算法除外】
目录
🌈序言
算法乃我长久之志也,此关必过。今日得此代码随想录之良品辅助,应按此路学之习之,而长久不可懈怠。
前一系列文章详细讲解了利用快慢指针求解入环节点,建议先将这部分知识掌握之后再来学习本篇内容,点击查看。
🔥 代码随想录22——链表8——快慢指针法——环形链表相遇节点-CSDN博客
🌈引出
题目:环形链表 II
给定一个链表的头节点 head
,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos
是 -1
,则在该链表中没有环。注意:pos
不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:返回索引为 1 的链表节点 解释:链表中有一个环,其尾部连接到第二个节点。
示例 2:
输入:head = [1,2], pos = 0 输出:返回索引为 0 的链表节点 解释:链表中有一个环,其尾部连接到第一个节点。
示例 3:
输入:head = [1], pos = -1 输出:返回 null 解释:链表中没有环。
提示:
- 链表中节点的数目范围在范围
[0, 104]
内 -105 <= Node.val <= 105
pos
的值为-1
或者链表中的一个有效索引
🌈进阶:你是否可以使用 O(1)
空间解决此题?
注意O(1)就是快慢指针的典型暗示。查看此篇题解:
代码随想录22——链表8——快慢指针法——环形链表相遇节点-CSDN博客
剖析题干重点:
是否拥有过?重复过?这都是哈希表的暗示。
🔥思路分析:
一个非常直观的思路是:我们遍历链表中的每个节点,并将它记录下来;一旦遇到了此前遍历过的节点,就可以判定链表中存在环。而且这就是第一个入环的节点。借助哈希表可以很方便地实现。
🌈最终代码:
public class Solution {
public ListNode detectCycle(ListNode head) {
ListNode pos = head;
var visited = new HashSet<ListNode>();
while (pos != null) {
if (visited.contains(pos)) {
return pos;
} else {
visited.add(pos);
}
pos = pos.next;
}
return null;
}
}
今日问题:
🔥Hash
HashSet、HashMap自己应该重点弥补。还没好好学集合呢!
今日总结:
🌈HashSet
var visited = new HashSet<ListNode>();
这行代码创建了一个 Set
集合,用于存储 ListNode
类型的对象。左边直接使用var就好,便捷(事实上这正是var的用途)。右边直接使用<ListNode>()即可。
这样做的好处有以下几点:
Set
集合不允许重复元素,可以方便地记录已经访问过的节点,避免重复处理。-
通过将节点对象存储在集合中,可以快速判断某个节点是否已经被访问过,(contains()提高算法的效率和准确性。 -
使用特定类型的集合(这里是ListNode
类型),确保了集合中存储的元素都是符合预期的节点对象,增加了代码的安全性和规范性。
这种方式在涉及到对节点的遍历或处理时,常常用于去重和状态记录等操作。
📣非常感谢你阅读到这里,如果这篇文章对你有帮助,希望能留下你的点赞👍 关注❤收藏✅ 评论💬,大佬三连必回哦!thanks!!!
📚愿大家都能学有所得,功不唐捐!
👇下面是专栏彩蛋系列,你会喜欢的!(为了避免影响算法的简洁与优美,这里直接将之前的几十个专栏简化为3个部分,不过你点击开后发现惊喜。)👇
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖
热门专栏
💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖💖