题目描述:
给你一个链表的头节点 head ,判断链表中是否有环。
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。
如果链表中存在环 ,则返回 true 。 否则,返回 false 。
解题思路:
本题目可以使用快慢指针去解决,具体操作如下:我们先定义一个快指针(fast)和慢指针(slow),我们每次让fast指针移动两步,slow指针移动一步,由于fast指针移动地比slow快,所以在环中(如果链表存在环),fast一定能和slow指针相遇!!!
代码:
public class Solution {
//Two Pointer
//Time Complexity: O(N)
//Space Complexity: O(1)
public boolean hasCycle(ListNode head) {
//定义快慢指针
ListNode fast = head;
ListNode slow = head;
//指针的移动
while (fast != null && fast.next != null) {
//fast移动两位
fast = fast.next.next;
//slow移动一位
slow = slow.next;
//如果存在环,则一定会相遇
if (fast == slow) {
return true;
}
}
return false;
}
}
部分代码解读:
1.为什么循环条件为fast != null && fast.next != null
2.为什么存在环就一定会相遇。
1.对于第一个操作,因为我们在实现判断链表是否存在环之前是不知道链表是否存在环的,所以如果存在环我们在指针的移动操作中对于p.next != null && p.next != null是一定满足的,也就是说,一个指针和指针的下一个都是不为空的,但由于快指针移动的较快,所以我们在while循环中对于fast判断fast != null && fast.next != null,如果不满足,则直接返回false!
2.对于第二个操作,我们可以这样想,有张三和李四人在一个环形操场上跑步,张三比李四李四跑的快,并且张三一开始在在李四前面,假设他们俩体力无限可以一直跑下去(张三也一直比李四快)所以在他们跑的过程中张三一定会和李四相遇!