2010-06-08 15 views
6

Possibili duplicati:
find whether a loop in a linked list without two pointers
How to determine if a linked list has a cycle using only two memory locations.
Best algorithm to test if a linked list has a cycleCome determinare se un elenco collegato contiene un ciclo?

Durante una preparazione per un colloquio di lavoro, ho incontrato alla seguente domanda:

Come è possibile determinare se un l'elenco collegato (di qualsiasi tipo) contiene un ciclo, usando additio la complessità dello spazio nale di O (1)? Non si può presumere che il ciclo inizi dal primo nodo (e, naturalmente, il ciclo non deve contenere tutti i nodi).

non riuscivo a trovare la risposta, anche se ho la sensazione è abbastanza semplice ...

+0

Ho perso questa esatta domanda su un'intervista me stesso. Sono stato in grado di fornire la soluzione di memoria e ora di O (* n *). – Thanatos

+1

Ho imparato a conoscere questo in una classe CS, ma non penso che sia una domanda particolarmente interessante dato che è "solo ovvio se lo sai già". –

+0

Molti, molti duplicati, ad es. [trova se un loop in una lista collegata senza due puntatori] (http://stackoverflow.com/questions/2338683/find-whether-a-loop-in-a-linked-list-without-two-pointers) –

risposta

11

facile. Mantieni due puntatori nella lista. Ad ogni passo, fai avanzare un puntatore con un singolo collegamento e fai avanzare l'altro di due collegamenti. Prova a vedere se puntano allo stesso elemento. Se è così, hai un ciclo. In caso contrario, ripetere fino a trovare un ciclo o si raggiunge la fine della lista.

+11

Ho trovato che questa soluzione era solo "facile" se lo sapevi. Questo è, a mio parere, un pensiero abbastanza intelligente. – Thanatos

+0

Interessante. Perché preoccuparsi di far avanzare l'altro? –

+0

Qualsiasi collegamento può essere uguale a qualsiasi altro link, quindi entrambi devono spostarsi all'interno dell'elenco per testare ogni combinazione (raggiungibile). – Ether

1

Probabilmente la stessa tecnica utilizzata per verificare se un grafico è un albero (gli alberi non possono avere cicli), vedere this this question. Raccomanda un ordinamento topologico o una prima ricerca di profondità.

-1

Ho avuto questo problema esatto in vero codice dal vivo la scorsa settimana.

Tutto ciò che ho fatto è stato mantenuto un puntatore (collegamento) per il primo elemento. Poi, mentre scorrevo l'elenco, se avessi di nuovo puntato quel puntatore, so che c'è un loop.

+1

Vedere i commenti sulla risposta accettata per il motivo per cui questo non accetterà i cicli * all * e perché questa è una soluzione migliore. –

+0

Il ciclo non inizia necessariamente dal primo elemento. –

Problemi correlati