回环问题

108 阅读1分钟
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;
    }


}