Что должен возвращать метод инвертирования связного списка
Что проверяют
Понимаете ли вы, что при развороте односвязного списка голова меняется, а значит метод обязан её вернуть. Заодно смотрят на аккуратность работы со ссылками и на то, уточняете ли вы контракт: разворачиваем на месте или строим новый список.
Как отвечать
Возвращать надо ссылку на новую голову, то есть узел (ListNode), а не void и не boolean. Новая голова это бывший хвост, узел уже существующий: итеративный разворот не создаёт ни одного нового объекта, он только переставляет ссылки. Пустой вход отдаёт null, список из одного узла отдаёт сам себя.
ListNode reverse(ListNode head) {
ListNode prev = null;
while (head != null) {
ListNode next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;
}Сложность O(n) по времени и O(1) по памяти. Рекурсивный вариант принимается, но у него стек глубиной в длину списка. Проговорите крайние случаи и то, что вход мутируется: ссылка вызывающего кода после разворота указывает на хвост. Если нужен неразрушающий вариант, он строит новые узлы и стоит O(n) памяти. Для java.util.LinkedList вопрос другой: там разворот делает Collections.reverse, руками его не пишут.
Где спотыкаются
Возвращают head вместо prev. К концу цикла head уже null, а если вернуть сохранённую заранее старую голову, получится список из одного элемента. На одном узле тест зелёный, на трёх падает.
Не сохраняют head.next до перезаписи. Как только выполнено head.next = prev, идти дальше некуда, хвост потерян. В отладчике это выглядит как обрыв на втором шаге или NullPointerException.
Пишут void и молча мутируют вход. Вызывающий остаётся со ссылкой на бывшую голову, которая теперь последний узел, и видит список из одного элемента. Для двусвязного списка добавьте, что менять надо обе ссылки в каждом узле и не забыть поле с хвостом.