32 votos

Mejor algoritmo para comprobar si una lista enlazada tiene un ciclo

¿Cuál es la mejor (interrumpiendo) algoritmo para determinar si una lista enlazada tiene un ciclo?

[Editar] Análisis de la complejidad asintótica para el tiempo y el espacio sería dulce de modo que las respuestas se pueden comparar mejor.

[Editar] pregunta Original no era el direccionamiento de los nodos con outdegree > 1, pero hay algunos a hablar de ello. Esa pregunta es más a lo largo de las líneas de "Mejor algoritmo para detectar ciclos en el grafo dirigido".

50voto

DrPizza Puntos 9355

Tiene dos punteros de la iteración a través de la lista; hacer una iterar a través de dos veces la velocidad de la otra, y comparar sus posiciones en cada paso. La parte superior de mi cabeza, algo así como:

node* tortoise(begin), hare(begin);
while(hare = hare->next)
{
    if(hare == tortoise) { throw std::logic_error("There's a cycle"); }
    hare = hare->next;
    if(hare == tortoise) { throw std::logic_error("There's a cycle"); }
    tortoise = tortoise->next;
}

O(n), que es tan bueno como usted puede conseguir.

1voto

kean Puntos 126

Condición previa: seguir la pista de el tamaño de la lista (actualizar el tamaño de whenenver un nodo se agrega o elimina).

Detección de bucle:

  1. Mantener un contador cuando se atraviesa el tamaño de la lista.

  2. Si el contador supera el tamaño de la lista, hay un posible ciclo.

Complejidad: O(n)

Nota: la comparación entre el contador y el tamaño de la lista, así como la operación de actualización de la lista tamaño, debe ser seguro para subprocesos.

0voto

OysterD Puntos 2698

¿Qué acerca del uso de una tabla hash para almacenar el ya visto nodos (los miras en orden desde el principio de la lista)? En la práctica, usted podría conseguir algo cerca de O(N).

De lo contrario, el uso de un ordenado montón en lugar de una tabla hash de lograr O(N log(N)).

0voto

Henrik Paul Puntos 22787

Me pregunto si hay alguna otra manera que no sólo se va de forma iterativa - rellenar una matriz como paso hacia delante, y comprobar si el nodo actual es ya presente en la matriz...

0voto

Liedman Puntos 3144

Konrad Rudolph algoritmo no funciona si el ciclo no está señalando el comienzo. La siguiente lista le hacen un bucle infinito: 1->2->3->2.

DrPizza del algoritmo es definitivamente el camino a seguir.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X