package com.justalk.javademo.leetcode
/**
* 问题:给定一个单链表,判断单链表中是否有环,并确定环的长度,程序实现
* 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。
* 示例 :
* 输入:head = [3,2,0,-4], pos = 1
* 输出:打印出是否有环(true\false),以及环的长度(int)
* 解释:链表中有一个环,其尾部连接到第二个节点
* 单链表定义如下:
*/
public class Linked {
public static void main(String[] args) {
ListNode listNode1 = new ListNode(3)
ListNode listNode2 = new ListNode(2)
ListNode listNode3 = new ListNode(0)
ListNode listNode4 = new ListNode(-4)
listNode1.next = listNode2
listNode2.next = listNode3
listNode3.next = listNode4
listNode4.next = listNode2
System.out.println("环数为:"+hasCycle( listNode1))
}
//给定一个链表,判断链表中是否有环
static class ListNode {
int val
ListNode next
ListNode(int x) {
val = x
}
}
static public int hasCycle(ListNode head) {
//先判断链表是否合法
if (head == null) {
return -1
}
//快慢指针法,创建两个指针,快指针 fast 一次走两步,慢指针 slow 一次走一步,如果相遇,表示有环,否则无环
ListNode fast = head
ListNode slow = head
while (fast != null && fast.next != null) {
fast = fast.next.next
slow = slow.next
if (fast == slow) {
//接下来确定环的个数
fast = fast.next
int count = 0
while (fast != slow){
count++
fast = fast.next
System.out.println(count)
}
return count+1
}
}
return -1
}
}