"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment l'algorithme de Floyd détecte-t-il les boucles dans les listes liées ?

Comment l'algorithme de Floyd détecte-t-il les boucles dans les listes liées ?

Publié le 2024-11-07
Parcourir:683

How Does Floyd\'s Algorithm Detect Loops in Linked Lists?

Détection de boucles dans les listes chaînées à l'aide de l'algorithme de Floyd

Déterminer si une liste chaînée donnée contient une boucle peut être une tâche difficile en programmation Java. Une boucle se produit lorsque le dernier nœud de la liste fait référence à un nœud précédent au lieu d'avoir une référence nulle.

Pour détecter efficacement les boucles, les développeurs utilisent souvent l'algorithme de recherche de cycle de Floyd, également connu sous le nom d'algorithme de la tortue et du lièvre. . Cet algorithme utilise deux références, une lente et une rapide, qui parcourent la liste à des vitesses différentes.

Par exemple, la référence lente avance d'un nœud tandis que la référence rapide avance de deux nœuds. Si la liste chaînée contient une boucle, ces références finiront par se rencontrer. D'un autre côté, s'il n'y a pas de boucle, la référence lente ou rapide (ou leurs références ultérieures) deviendra nulle avant que l'autre n'atteigne la fin de la liste.

Voici une implémentation Java de l'algorithme de Floyd. :

boolean hasLoop(Node first) {
    if (first == null) {
        return false; // List does not exist, so no loop
    }

    Node slow, fast; // Create two references.
    slow = fast = first; // Make both refer to the start of the list.

    while (true) {
        slow = slow.next; // One hop.

        if (fast.next != null) {
            fast = fast.next.next; // Two hops.
        } else {
            return false; // No loop.
        }

        if (slow == null || fast == null) {
            return false; // No loop.
        }

        if (slow == fast) {
            return true; // Loop detected.
        }
    }
}

Cet algorithme prend une complexité spatiale O(1) et s'exécute en un temps O(n), ce qui le rend à la fois efficace en mémoire et raisonnablement long.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3