2010-06-08 3 views
6

Возможные Дубликаты:
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 cycleКак определить, содержит ли связанный список цикл?

Во время подготовки к собеседованию, я столкнулся следующий вопрос:

Как вы можете определить, является ли связанный список (любого типа) содержит цикл, используя additio (1)? Вы не можете предположить, что цикл начинается с первого узла (и, конечно, цикл не должен содержать всех узлов).

я не мог найти ответ, хотя у меня есть ощущение, что это довольно просто ...

+0

Я пропустил этот точный вопрос на собеседовании. Я мог только дать решение O (* n *) памяти и времени. – Thanatos

+1

Я узнал об этом в классе CS, но я не думаю, что это особенно хороший вопрос, так как он «очевиден, если вы уже знаете». –

+0

Многие, много дубликатов, например. [найти ли цикл в связанном списке без двух указателей] (http://stackoverflow.com/questions/2338683/find-whether-a-loop-in-a-linked-list-without-two-pointers) –

ответ

11

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

+11

Я обнаружил, что это решение было «просто», если вы это знали. Это, на мой взгляд, довольно умное мышление. – Thanatos

+0

Интересно. Зачем беспокоиться о другом? –

+0

Любая ссылка может быть равна любой другой ссылке, поэтому они должны перемещаться по списку для проверки каждой (достижимой) комбинации. – Ether

1

Возможно, такая же методика, как проверка, является ли граф деревом (деревья не имеют циклов), см. this this question. Он рекомендует либо топологическую сортировку, либо первый поиск глубины.

-1

У меня была эта точная проблема с реальным кодом на прошлой неделе.

Все, что я сделал, содержал указатель (ссылка) для первого элемента. Затем, когда я перебирал список, если я когда-либо получил этот указатель, я знаю, что есть цикл.

+1

См. Комментарии к принятому ответу, почему это не будет ловить * все * циклы и почему это лучшее решение. –

+0

Цикл не обязательно начинается с первого элемента. –

Смежные вопросы