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

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

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


person Derek Li    schedule 13.09.2011    source источник
comment
Если кому-то интересно, есть несколько более быстрая модификация алгоритма: siafoo.net/algorithm/11   -  person Dave    schedule 26.09.2011


Ответы (3)


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

person Paul R    schedule 13.09.2011
comment
Это проясняет. Спасибо всем, так как я могу отметить только один правильный ответ, отмечу самый ранний. - person Derek Li; 13.09.2011

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

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

введите описание изображения здесь

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


Кстати, лассо - это технический предел теории графов, а ковбой - нет.

person DaveFar    schedule 13.09.2011

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

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

person flight    schedule 13.09.2011
comment
просто удалил несколько мелких опечаток, так что я могу дать вам 50+ за неделю с чистой совестью (так как вы просто пропустили прием на пару секунд). - person DaveFar; 20.09.2011
comment
@DaveBall Вау. Спасибо. Рад, что ты заметил. ;) - person flight; 20.09.2011