/**
* 判断一个链表是否有环,
* 思路是快慢指针法,通过判断两个节点是否==,
* 即内存地址相同则证明链表有环存在
*/
public class LinkedListCycle {
/**
* 给定一个链表,判断链表中是否有环。
* 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
* 如果 pos 是 -1,则在该链表中没有环。
* 示例 1:
* 输入:head = [3,2,0,-4], pos = 1
* 输出:true
* 解释:链表中有一个环,其尾部连接到第二个节点。
* 示例 2:
* 输入:head = [1,2], pos = 0
* 输出:true
* 解释:链表中有一个环,其尾部连接到第一个节点。
* 示例 3:
* 输入:head = [1], pos = -1
* 输出:false
* 解释:链表中没有环。
* 来源:力扣(LeetCode)
* 链接:https://leetcode-cn.com/problems/linked-list-cycle
* 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
* @param head 链表的头
* @return 是否有环
*/
public static boolean hasCycle(ListNode head){
if(head == null || head.next == null){
return false;
}
//慢指针
ListNode slow = head;
//快指针
ListNode fast = head;
while(fast != null && fast.next != null){
slow = slow.next;
fast = fast.next.next;
if(slow == fast){
return true;
}
}
return false;
}
public static void main(String[] args){
//案例一
ListNode head = new ListNode(3);
ListNode head1 = new ListNode(2);
ListNode head2 = new ListNode(0);
ListNode head3 = new ListNode(-4);
head.next = head1;
head1.next = head2;
head2.next = head3;
head3.next = head2;
System.out.println(hasCycle(head));
//案例二
ListNode node = new ListNode(1);
ListNode node1 = new ListNode(2);
node.next = node1;
node1.next = node;
System.out.println(hasCycle(node));
//案例三
ListNode list = new ListNode(1);
System.out.println(hasCycle(list));
}
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}