La détection de boucles dans les listes chaînées est une question d'entretien classique qui nécessite une compréhension sophistiquée des structures de données et des algorithmes. Nous présentons une solution méticuleuse à ce problème en utilisant l'algorithme de recherche de cycle de Floyd.
L'algorithme de Floyd utilise deux références, l'une avançant un pas à la fois et l'autre avançant de deux pas à la fois. Cette vitesse différentielle garantit que s'il y a une boucle dans la liste, les deux références finiront par se rencontrer.
Voici une présentation étape par étape de l'algorithme :
La fonction Java suivante implémente l'algorithme de Floyd :
<code class="java">public static boolean hasLoop(Node first) { if (first == null) // List does not exist, no loop return false; Node slow, fast; // Create two references slow = fast = first; // Point both to the start of the list while (true) { slow = slow.next; // 1 hop if (fast.next != null) fast = fast.next.next; // 2 hops else return false; // Next node null -> no loop if (slow == null || fast == null) // If either hits null, no loop return false; if (slow == fast) // If the two ever meet, we have a loop return true; } }</code>
Cet algorithme a une complexité spatiale constante, car il n'utilise que deux références, et une complexité temporelle raisonnable de O(n), où n est le nombre de nœuds dans la liste.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!