题目:环形链表
分析:
快慢指针一前一后的遍历,只要存在环,迟早会相遇;
思路:
- 特判:
为空
或者仅有一个节点
的链表肯定没有环,排除!; - 初始化:
- 慢指针
slow
指向第一个节点; - 快指针
fast
指向slow
后面的节点;
- 慢指针
- 只要
slow
和fast
不相遇,就进行循环遍历,每次进行如下操作:- 判断
fast
是否指向空或者最后一个节点,为什么最后一个节点也要,因为fast
每次走两步,如果当前为最后一个节点的话,那么就办法前行了。 slow
走一步,fast
走两步(其实只要两者步伐不一致就可以了)。
- 判断
public class Solution {
public boolean hasCycle(ListNode head) {
//特判
if(head == null || head.next == null) return false;
//初始化
ListNode slow = head;
ListNode fast = head.next;
//循环
while(slow != fast){
if(fast == null || fast.next == null){
return false;
}
//更新
slow = slow.next;
fast = fast.next.next;
}
return true; //能跳出循环走到这一步就说明,存在slow==fast,也就是存在环形了
}
}