2010-06-08 20 views
6

Możliwe duplikaty:
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 cycleJak ustalić, czy połączona lista zawiera pętlę?

Podczas przygotowań do rozmowy kwalifikacyjnej, natknąłem się na następujące pytanie:

Jak można określić, czy Lista połączona (dowolnego typu) zawiera pętlę, używając additio końcowa złożoność przestrzeni O (1)? Nie można założyć, że pętla zaczyna się od pierwszego węzła (i oczywiście pętla nie musi zawierać wszystkich węzłów).

nie mogę znaleźć odpowiedzi, chociaż mam wrażenie, że to całkiem proste ...

+0

Sam przeoczyłem to dokładne pytanie podczas wywiadu. Byłem w stanie podać tylko rozwiązanie pamięci i czasu O (* n *). – Thanatos

+1

Dowiedziałem się o tym w klasie CS, ale nie sądzę, że jest to szczególnie dobre pytanie, ponieważ jest "oczywiste, jeśli już wiesz". –

+0

Wiele, wiele duplikatów, np. [znajdź pętlę na liście połączonej bez dwóch wskaźników] (http://stackoverflow.com/questions/2338683/find-whether-a-loop-in-a-linked-list-without- dwóch-pointers) –

Odpowiedz

11

łatwe. Utrzymuj dwa wskaźniki na liście. Na każdym kroku przesuń jeden wskaźnik o jedno łącze i przesuń drugi o dwa łącza. Sprawdź, czy wskazują na ten sam element. Jeśli tak, masz pętlę. Jeśli nie, powtarzaj, aż znajdziesz pętlę lub dojdziesz do końca listy.

+11

Stwierdziłem, że to rozwiązanie było tylko "łatwe", jeśli je znasz. Jest to, moim zdaniem, całkiem sprytne myślenie. – Thanatos

+0

Interesujące. Po co zawracać sobie głowę innym? –

+0

Każde łącze może być równe dowolnemu innemu linkowi, więc oba muszą poruszać się po liście, aby przetestować każdą (osiągalną) kombinację. – Ether

1

Prawdopodobnie taka sama technika jak sprawdzenie, czy wykres jest drzewem (drzewa nie mają cykli), patrz this this question. Zaleca najpierw wyszukiwanie topologiczne lub głębokie pierwsze wyszukiwanie.

-1

Miałem ten problem w prawdziwym kodzie na żywo w zeszłym tygodniu.

Wszystko co zrobiłem, to trzymałem wskaźnik (link) dla pierwszego elementu. Potem, kiedy przeglądałem listę, jeśli kiedykolwiek otrzymałem ten wskaźnik, wiem, że jest pętla.

+1

Zobacz komentarze na temat zaakceptowanej odpowiedzi, dlaczego nie spowoduje to przechwycenia * wszystkich * cykli i dlaczego jest to lepsze rozwiązanie. –

+0

Pętla niekoniecznie zaczyna się od pierwszego elementu. –

Powiązane problemy