Вам нужно проверить свой код (т.е. запустить его в своей голове) на случай:
1 -> 2 -> 3 -|
Это самый простой случай, когда ваш алгоритм ломается.
Ваш код будет установите для a
и b
значение 1
, затем введите l oop. a
затем повышается до 2
и b
повышается до 3
.
В следующей итерации l oop, a
повышается до 3
, но b
остается на 3
потому что b.next
равно нулю. Это означает, что a
может свободно продвигаться без b
, не продвигаясь быстрее или не находя конца. В конце концов, a
поймает до b
(a) , и вы будете считать, что зацикленный список.
То, что вам нужно , чтобы сделать, это продвиньте b
на два, если это возможно, но если нет, продвиньте его как можно дальше.
Это так же просто, как (псевдокод):
b = b.next
if b is not null:
b = b.next
Таким образом, b
гарантированно либо опередит a
, либо найдет конец списка.
Если вам нужны более глубокие знания об этом алгоритме, взгляните на Поиск l oop в односвязном списке , который подробно объясняет оба алгоритма, и , позволяет найти начало l oop.
* 1046. *
(a) Интересно, что это именно то, что происходит в реальной черепахе и басне. Заяц останавливается, чтобы отдохнуть, и черепаха развевается, в конце концов обгоняя зайца и выигрывая гонку.
Что ж, выиграет гонку, если мы не назовем остановку как как только он догнал: -)