Cómo encontrar un nodo dentro de una lista enlazada que hace referencia a otro nodo

Si tenemos una lista enlazada con 10 nodos y el sexto nodo se refiere al segundo nodo. ¿Cómo podemos determinar que existe un bucle dentro

preguntado el 12 de junio de 14 a las 11:06

Si cicla después del sexto nodo, ¿cómo puedes tener 6 nodos? -

Si decide que la lista enlazada solo puede tener 6 nodos, esto es un duplicado de ¿Cómo detectar un bucle en una lista enlazada? -

Terrible implementación de la lista enlazada, supongo. -

2 Respuestas

Hay algunos interesantes detección de ciclo algoritmos, el más famoso es el algoritmo "la tortuga y la liebre" (también conocido como detección del ciclo de Floyd). Se basa en la idea de que si la liebre camina el doble de rápido que la tortuga, si hay un ciclo, se volverán a encontrar.

El algoritmo de Brent es un poco más complicado, pero tiende a evaluar menos la función "siguiente" (aquí: sigue menos punteros).

Hay maneras de usar aún menos evaluaciones. Por lo que sé, todos ellos se basan en el uso de más almacenamiento. La forma más obvia es simplemente mantener una tabla hash de "nodos vistos hasta ahora" y detectar un ciclo cuando esté a punto de agregarle un nodo que ya está allí, detectando inmediatamente un nodo que ve por segunda vez pero tomando O(n) espacio. Detección de bucle de Gosper El algoritmo solo ocupa el espacio O (log n), y es mucho más interesante (quizás un poco difícil de entender). También hay un algoritmo ajustable (espacio frente a evaluaciones) basado en el uso varias pilas (El artículo contiene enlaces a aún más algoritmos).

Respondido el 12 de junio de 14 a las 14:06

Esta situación no puede ocurrir porque si tiene 10 nodos, el último nodo debe ser nulo en la lista vinculada. Como dice anteriormente, su quinto nodo debería ser nulo en esta situación y solo tendrá 5 elementos. Si está utilizando una lista enlazada circular, puede verificar

 '(last->data== (first++)->data)'

Respondido 18 Jul 14, 15:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.