Цикл 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
является нулевым указателем, это означает недопустимое разыменование, и программа будет вести себя неопределенно.