⭐️LeetCode每日一题⭐️
- 🍭 博客主页:南七的博客主页
- 🏀期待得到大家的点赞👍收藏💌留言🙋和关注💗
- 💬 持续刷题,每日一题 05
- 🔥Leetcode 热题 🔥🔥🔥 Hot100
- 🙅博主水平有限,如果发现有不对的地方,希望大佬们指正!
- 😄放弃很容易,但坚持一定很酷,人生一次,怎愿甘拜下风!
- 💻来源:Leetcode 热题 Hot100 141. 环形链表
- 系列文章持续更新中…
🏀 1.挡住众人的两数之和…
🏀2.趁室友吃鸡,刷一道回文链表
🏀 3.我连两个数相加都不会(挠头ing)(Leetcode 热题 Hot100)
🏀 4.终于秒杀了一题【删除链表的倒数第 N 个结点】(Leetcode 热题 Hot100)
题目描述
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意: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
解释:链表中没有环。
📑博主题解1️⃣:
刚拿到题目还是有点懵的,没看懂题目的pos是什么意思。之后才反应过来,pos标明的是链表尾所指向前面结点的索引号。该题要求判断链表是否成环,该链表是单向链表,那么应该就会想到,如果链表成环的话,其中的某些结点一定是会被重复访问的。那么第一个想到的就是,我们只要知道,该链表是否被访问过就可以了。可惜不是自定义的链表结构,我第一个想到的是给每一个结点添加一个状态,被访问过的结点直接更改其状态就可以了。可是,链表结构是规定死的,无法更改。这就突然让我想到使用哈希表的办法。对于每一个访问过的结点,我们只需要将其添加到哈希表中即可。那么Set集合就可以很好的帮助我们,set集合是不允许出现重复元素的,当我们想要向表中添加已经存在的元素时,就会返回false,那么这个就是我们的关键判断条件了。
public class Solution {
public boolean hasCycle(ListNode head) {
Set<ListNode> set = new HashSet<>();
ListNode cur = head;
while(cur != null){
//如果当前结点已经遍历过了,就添加失败,返回false
if(!set.add(cur)){
return true;
}
//指针后移
cur = cur.next;
}
return false;
}
}
📑博主题解2️⃣:
还有一种办法–快慢指针。我们给定两个指针,让他们都指向头结点,快指针每次向后遍历两个结点,慢指针每次向后遍历一个结点。试想一下,如果链表成环,那么快指针很快又会和慢指针相遇。这就像我们在一个操场上跑步,你们同时出发,可能下次再见到他的时候,他已经甩你一圈了。所以,我们只需要判断,两个指针是否相遇,如果相遇,就说明链表成环。如果fast指针为空了,就说明链表不成环。
public class Solution {
public boolean hasCycle(ListNode head) {
if(head == null){
return false;
}
ListNode fast = head;
ListNode slow = head;
//这里只需要判断快指针就行了
//博主一开始还傻乎乎的在那判断slow != null,快指针为null,自然就不需要判断慢指针了
while(fast != null&&fast.next != null){
//快指针每次向后遍历两个结点
fast = fast.next.next;
//慢指针每次向后遍历一个结点
slow = slow.next;
//如果二者相遇,说明链表成环,返回true
if(fast == slow)
return true;
}
return false;
}
}
🏀期待得到大家的点赞👍收藏💌留言🙋和关注💗