题目描述
Given a linked list, determine if it has a cycle in it.Can you solve it without using extra space?
给你一个链表,确定它是否有环的存在。最好不使用额外的空间
解题思路
采用“快慢指针”查检查链表是否含有环。让一个指针一次走一步,另一个一次走两步,如果链表中含有环,快的指针会再次和慢的指针相遇。
它的原理是什么呢?用通俗的话来讲:
一段带环的跑道,L1为直线跑道,L2为环形跑道,进入环形跑道后会一直绕圈跑,A速度为B速度的2倍,一起出发,最终A和B会跑过一段共有距离L1,当B进入L2后必会和A再次相遇。
如果L2不为环形,当A跑完L2段则结束,远超B跑的距离,不会和B相遇。
代码
/**
* Definition for singly-linked list.
* class ListNode {
* int val;
* ListNode next;
* ListNode(int x) {
* val = x;
* next = null;
* }
* }
*/
public class Solution {
public boolean hasCycle(ListNode head) {
ListNode slowNode = head;
ListNode fastNode = head;
while(fastNode != null && fastNode.next != null) {
slowNode = slowNode.next;
fastNode = fastNode.next.next;
if(slowNode == fastNode)
return true;
}
return false;
}
}