目录
一.题目
1.题目详情
给你一个链表的头节点 head
,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next
指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos
来表示链表尾连接到链表中的位置(索引从 0 开始)。
注意:pos
不作为参数进行传递 。仅仅是为了标识链表的实际情况
要求:如果链表中存在环 ,则返回 true 。 否则,返回 false 。
示例 1:
输入:head = [3,2,0,-4], pos = 1 输出:true 解释:链表中有一个环,其尾部连接到第二个节点。 力扣:141. 环形链表 - 力扣(Leetcode)https://leetcode.cn/problems/linked-list-cycle/description/
二.解题思路
1.判断一个链表是否存在环,可以使用快慢指针
2.将拿到的头结点存到慢指针,将拿到的头结点的下一跳存到快指针
3.这时我们先要判断这个链表是不是空和是不是只有一个结点,是就直接返回false
4.接下来慢指针一次跳一个,快指针一次跳两个
5.如果快指针和快指针的下一跳为空,则这个链表没环,返回false
6.这时如果快指针等于慢指针,就表示这个链表有环
三.代码
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null||head.next==null)
return false;
ListNode fast,slow;
fast=head.next;
slow=head;
while(fast!=slow){
if(fast==null||fast.next==null)
return false;
fast=fast.next.next;
slow=slow.next;
}
return true;
}
}
四.题后语()
看到这道题,我的第一反应是使用快慢指针,在我写完代码后执行通过后,信心满满的点了提交,结果给我报了个空指针异常,然后我才反应过来,没有把链表可能为空和只有一个结点这种情况,考虑问题还是要多注意细节。然后就是我看了一下力扣的官方的题解,方法一就是将链表的结点一个个拿出来到另外一个set表上,然后如果出现重复的就是表示有环。方法二就是我所用的快慢指针。