给你一个链表的头节点 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 照样是空指针异常。因此,这两个条件都必须满足。