/*环:在一个单链表中存在一个循环子链表,有两种解题思路
思路一:从当前head出发,每前进一步就往回比较所有前驱节点,看是否是相同节点,若是则存在环、
思路二:定义快慢指针,快指针每次走两步,慢指针每次走一步,若快慢指针相遇,则存在环,否则不存在环
这里采用快慢指针的方法
*/
//这是一个定义好的节点
class ListNode {
int val;
ListNode next;
ListNode(int x) {
val = x;
next = null;
}
}
public class Solution {
public boolean hasCycle(ListNode head) {
if(head==null || head.next==null){//空链表势必不存在环
return false;
}
//定义快慢指针
ListNode fast = head;
ListNode slow = head;//快慢指针都从head开始走
while(fast != null && fast.next != null){//遍历循环终止条件
//遍历
fast = fast.next.next;//快指针走两步
slow = slow.next;//慢指针走一步
if(fast == slow){//快慢指针相等说明找到了
return true;}
}
return false;//遍历结束都没有找到环的话说明没有找到
}
}