2011-09-13 26 views
43

Leí una pregunta de una entrevista en línea sobre cómo encontraría un bucle en una lista vinculada, y la solución (algoritmo de búsqueda de ciclos de Floyd) es tener dos punteros, uno es 2 veces más rápido que el otro , y verifica si se encuentran nuevamente.Algoritmo de detección de bucle de lista enlazada

Mi pregunta es: ¿por qué no puedo mantener un puntero fijo, solo mover el otro puntero hacia delante en 1 paso cada vez?

+7

Hay una modificación algo más rápida del algoritmo, si alguien tiene curiosidad: http://www.siafoo.net/algorithm/11 – Dave

Respuesta

55

Porque el primer puntero (que no se mueve) podría no estar dentro del bucle, por lo que los punteros nunca se encontrarían. (Recuerde que un bucle puede consistir en solo una parte de la lista.)

+1

Eso lo aclara. Gracias a todos, ya que solo puedo marcar una respuesta correcta, marcaré la primera. –

26

Porque el bucle puede no contener el elemento al que apunta el primer puntero.

Por ejemplo, si el primer puntero apunta al elemento 1 y la lista vinculada tiene un bucle más adelante (1-> 2-> 3-> 4-> 2), su algoritmo no lo detectará.

+0

acabo de eliminar algunos errores menores de ortografía así puedo darte los 50+ en una semana con buena conciencia (ya que te perdiste de ser aceptado por un par de segundos). – DaveFar

+0

@DaveBall Wow. Gracias. Me alegro de que lo hayas notado. ;) – quasiverse

82

Porque quizás no todo el linkedList esté dentro del ciclo.

Para una lista enlazada lazo algoritmo de detección, se necesitan dos punteros:

enter image description here

Mientras el primer puntero es donde el vaquero es, no se detecta ningún bucle. Pero si lo mueve paso a paso hacia adelante, eventualmente ingresará al ciclo.


BTW, lasso es el término técnico de la teoría de grafos, vaquero no lo es.

+33

+1 para el vaquero. – Heinzi

+2

yeeeeeeeehaw :) – DaveFar

+2

+1 por la actitud decente hacia @quasiverse y el vaquero – Basic

Cuestiones relacionadas