Цикл while в «Поиске середины связанного списка»

При написании кода для поиска середины связанного списка. Я столкнулся с проблемой: я не могу понять, почему один снайпер работает, а другой нет. Фрагмент работает

              ListNode *slow = head, *fast = head;
        while (fast && fast->next)
            slow = slow->next, fast = fast->next->next;
        return slow;

Фрагмент не работает

              ListNode *slow = head, *fast = head;
        while (fast->next && fast)
            slow = slow->next, fast = fast->next->next;
        return slow;

Насколько я понимаю, поскольку у нас есть условие «&&», оно войдет в цикл только тогда, когда оба условия выполнены, однако второй фрагмент не выполняется в некоторых тестовых случаях. Заранее спасибо.

1 ответ

The &&является оператором короткого замыкания , так что второй операнд оценивается только тогда, когда первый операнд принимает истинное значение.

Правильный код имеет это:

      (fast && fast->next)

Это означает, что оно оценивается только тогда, когда не является нулевым указателем.

Теперь возьмите другой код:

      (fast->next && fast)

Здесьfast->nextсначала оценивается, прежде чем будет проверено, что это не нулевой указатель. Еслиfast является нулевым указателем, это означает недопустимое разыменование, и программа будет вести себя неопределенно.

Другие вопросы по тегам