Бесплатная бета: 30 дней полного доступа, без карты.Зарегистрироваться бесплатно

Мы используем необходимые куки для работы сайта (вход и язык). Формы обратной связи и сообщения об ошибке дополнительно используют Google reCAPTCHA для защиты от спама. Она загружается только если вы согласитесь. Политика конфиденциальности

Полевой справочник

Быстрый и медленный указатели

O(n)

Пусти два указателя от головы списка: медленный на один шаг, быстрый на два шага за раз. Если есть цикл, они рано или поздно встретятся; если цикла нет, быстрый первым дойдёт до конца. Точка встречи также даёт средний узел.

Сигналы

обнаружить цикл в связном спискенайти, где начинается циклнайти средний узел спискаопределить, является ли список палиндромомбез доп. памяти / O(1) память, только указатели

Шаблон

function hasCycle(head) {
    let slow = head;
    let fast = head;
    while (fast && fast.next) {
        slow = slow.next;
        fast = fast.next.next;
        if (slow === fast) return true;
    }
    return false;
}

Похоже, но не то

  • Два указателя (с концов): Указатели с концов стартуют с обоих концов массива и сходятся навстречу друг другу. Быстрый/медленный оба стартуют с головы списка и идут вперёд с разной скоростью; у односвязного списка нет «другого конца», откуда можно было бы сходиться.

n до 1e5 узлов -> O(n): быстрый указатель проходит не более 2n шагов до встречи с медленным или конца списка.

Изучить этот паттерн