141.环形链表
- 题目描述
- 思路分析
- 快慢指针思想
- 代码实现
题目描述
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
思路分析
快慢指针思想
本题我们将采用快慢指针解决,那什么是快慢指针思想呢?
假设两个指针,一个快指针和一个慢指针(两个指针的指向不能相同,否则还没开始就结束判断条件了,因为它们相遇了),那什么又是快慢指针呢?慢指针每次走一步(即slow.next),快指针每次走两步(即fast.next.next)。
按照这步伐,如果是有环的,快慢指针必定会进环相遇,相遇就是说快慢指针所指向的节点都是相同。打个简单的例子,小明和小红在操场跑步,小明跑着快,小红跑着慢,那跑着快的肯定会追上跑着慢的,这就是相遇。
代码实现
/**
* @Author: 爱摸鱼的TT~
* @Description: https://leetcode.cn/problems/linked-list-cycle/
* @Date Created in 2022-11-20 15:20
* @Modified By:
*/
public class _141_环形链表 {
public boolean hasCycle(ListNode head) {
if(head == null || head.next == null){
return false;
}
ListNode slow = head;
ListNode fast = head.next;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
return true;
}
}
return false;
}
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
}
有同学疑问着:在while循环的判断条件,能不能只写其一呢?答案肯定是不行的啦,why?
大家想想,如果去掉 fast != null ,那这时有可能 fast.next.next = null ,这时再次进行条件判断,是不是会报空指针异常呢;那如果去掉 fast.next != null 会造成什么后果?有可能 fast.next = null 这时 fast = null.next 照样是空指针异常。因此,这两个条件都必须满足。