📜  用于查找链表中循环长度的Java程序(1)

📅  最后修改于: 2023-12-03 15:11:17.243000             🧑  作者: Mango

用于查找链表中循环长度的Java程序介绍

在链表中,如果存在循环,可以使用双指针法来判断。在双指针相遇后,可以通过慢指针重新回到起点,每次慢指针移动一步,快指针不动,直到两个指针再次相遇,那么快指针移动的距离就是循环长度。

以下是一个用于查找链表中循环长度的Java程序:

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) { val = x; next = null; }
 * }
 */
public class Solution {
    public int detectCycleLength(ListNode head) {
        if(head == null || head.next == null){
            return 0;
        }
        ListNode slow = head;
        ListNode fast = head;
        boolean hasCycle = false;
        while(fast != null && fast.next != null){
            slow = slow.next;
            fast = fast.next.next;
            if(slow == fast){
                hasCycle = true;
                break;
            }
        }
        if(!hasCycle){
            return 0;
        }
        slow = head;
        int length = 0;
        while(slow != fast){
            slow = slow.next;
            fast = fast.next;
        }
        ListNode temp = slow;
        do{
            temp = temp.next;
            length++;
        }while(temp != slow);
        return length;
    }
}

该程序使用快慢指针法查找链表中的循环,并计算循环的长度。程序首先判断链表是否为空或只有一个节点,如果是,则不存在循环。否则定义两个指针 slow 和 fast 都指向链表的头部。

接下来进行循环,每次慢指针 slow 指向下一个节点,快指针 fast 指向下下个节点。如果存在循环,快指针最终会追上慢指针,两个指针相遇,并跳出循环。

判断是否存在循环,如果不存在,返回0。否则,将慢指针 slow 指回头部。然后定义一个计数器 length,并使用两个指针 slow 和 fast,在它们相遇的地方停止。此时,这个节点将是循环的起点。最后再次移动指针 slow 并每次将 length 加1,直到 slow 回到起点。长度就等于计数器 length 的值。

以上便是用于查找链表中循环长度的Java程序的介绍。