Есть «медленный» указатель, который перемещает один узел за раз.Существует «быстрый» указатель, который перемещается вдвое быстрее, по два узла за раз.
Визуализация, когда медленные и быстрые указатели перемещаются по связанному списку с 10 узлами:
1: |sf--------|
2: |-s-f------|
3: |--s--f----|
4: |---s---f--|
5: |----s----f|
Вв этом пункте одна из двух вещей верна: 1) связанный список не зацикливается (проверяется с помощью fast! = null && fast.next! = null) или 2) он зацикливается.Давайте продолжим визуализацию, предполагая, что это делает цикл:
6: |-f----s---|
7: |---f---s--|
8: |-----f--s-|
9: |-------f-s|
10: s == f
Если связанный список не зациклен, быстрый указатель заканчивает гонку в O (n / 2) время;мы можем удалить константу и назвать ее O (n).Если связанный список выполняет цикл, медленный указатель перемещается по всему связанному списку и, в конечном итоге, становится равным более быстрому указателю в момент времени O (n).