Алгоритм обнаружения петли связанного списка

Я прочитал вопрос интервью онлайн о том, как бы вы нашли, есть ли цикл в связанном списке, и решение ( алгоритм поиска циклов Флойда) должен иметь два указателя, один на 2x быстрее, чем другой, и проверить, встречаются ли они снова.

мой вопрос: почему я не могу просто сохранить один указатель фиксированным, просто переместить другой указатель вперед на 1 шаг каждый раз?

3 ответов


потому что первый (неподвижный) указатель может не находиться в цикле, поэтому указатели никогда не встретятся. (Помните, что цикл может состоять только из части списка.)


потому что, возможно, не полный linkedList находится в цикле.

для связанного списка лассо алгоритм обнаружения, вам нужны два указателя:

enter image description here

пока первый указатель находится там, где находится ковбой, цикл не обнаружен. Но если вы переместите его шаг вперед, он в конечном итоге войдет в цикл.


кстати, лассо-это terminus technicus из теории графов, ковбой-нет.


поскольку цикл может не содержать элемент, на который указывает первый указатель.

например, если первый указатель указывает на элемент 1, а связанный список имеет цикл позже (1->2->3->4->2), Ваш алгоритм его не обнаружит.