Алгоритм обнаружения петли связанного списка
Я прочитал вопрос интервью онлайн о том, как бы вы нашли, есть ли цикл в связанном списке, и решение ( алгоритм поиска циклов Флойда) должен иметь два указателя, один на 2x быстрее, чем другой, и проверить, встречаются ли они снова.
мой вопрос: почему я не могу просто сохранить один указатель фиксированным, просто переместить другой указатель вперед на 1 шаг каждый раз?
3 ответов
потому что первый (неподвижный) указатель может не находиться в цикле, поэтому указатели никогда не встретятся. (Помните, что цикл может состоять только из части списка.)
потому что, возможно, не полный linkedList находится в цикле.
для связанного списка лассо алгоритм обнаружения, вам нужны два указателя:
пока первый указатель находится там, где находится ковбой, цикл не обнаружен. Но если вы переместите его шаг вперед, он в конечном итоге войдет в цикл.
кстати, лассо-это terminus technicus из теории графов, ковбой-нет.
поскольку цикл может не содержать элемент, на который указывает первый указатель.
например, если первый указатель указывает на элемент 1, а связанный список имеет цикл позже (1->2->3->4->2), Ваш алгоритм его не обнаружит.