Las siguientes son diferentes formas de hacer esto
Usar Hashing:
Recorre la lista uno por uno y sigue colocando las direcciones de nodo en una tabla hash. En cualquier momento, si se alcanza NULL, entonces devuelve falso y si el siguiente nodo actual apunta a cualquiera de los nodos almacenados previamente en Hash, entonces devuelve verdadero.
Marcar nodos visitados:
Esta solución requiere modificaciones a la estructura básica de datos de la lista vinculada. Tener una bandera visitada con cada nodo. Recorre la lista vinculada y sigue marcando los nodos visitados. Si vuelve a ver un nodo visitado, entonces hay un bucle. Esta solución funciona en O (n) pero requiere información adicional con cada nodo.
Una variación de esta solución que no requiere modificación a la estructura de datos básica se puede implementar utilizando hash. Simplemente almacene las direcciones de los nodos visitados en un hash y si ve una dirección que ya existe en el hash, entonces hay un bucle.
Algoritmo de búsqueda del ciclo de Floyd:
Este es el método más rápido. Recorrer la lista vinculada con dos punteros. Mueva un puntero por uno y otro puntero por dos. Si estos punteros se encuentran en algún nodo, entonces hay un bucle. Si los punteros no se encuentran, la lista vinculada no tiene bucle.
- ¿Aproximadamente cuánto más rápido es el GCD binario que el algoritmo euclidiano para la aritmética de precisión fija en las computadoras actuales?
- ¿Deberíamos usar un árbol rojo-negro con más frecuencia para abordar los problemas de integridad de NP? ¿Es esto cierto?
- ¿El interés por los algoritmos genéticos y evolutivos está en declive?
- Según usted, ¿cuáles son los algoritmos de aprendizaje automático más importantes en la actualidad?
- ¿Es útil leer 5 o más libros para algoritmos, o debería leer solo uno o dos y usar los otros como referencia para algún algoritmo en particular?
Este es el fragmento de código para el ciclo Floyd’s Cycle -Finding
while (slow_p && fast_p &&
fast_p-> siguiente)
{
slow_p = slow_p-> siguiente;
fast_p = fast_p-> next-> next;
si (slow_p == fast_p)
{
printf (“Loop encontrado”);
retorno 1;
}
}
Feliz codificación !!
Fuente: – Página en geeksforgeeks.org