Существуют ли ограничения по сложности или количеству строк для решения задачи инвертирования связного списка
Что проверяют
Это уточняющий вопрос от кандидата, и задают его не зря: по формулировке видно, понимает ли человек, что у задачи есть несколько правильных решений с разной ценой. Заодно проверяют, начнёте ли вы писать код молча. Собеседующий почти всегда ждёт, что ограничения проговорят вслух, и его ответ подскажет, какое решение от вас хотят увидеть.
Как отвечать
Спросите прямо про три вещи: разрешена ли рекурсия, можно ли менять исходный список или нужен новый, есть ли ограничение на дополнительную память. Ответ читается так: «память константная» означает разворот указателей на месте, «список менять нельзя» означает сборку нового, «как угодно, лишь бы работало» означает, что смотрят на процесс, а не на трюк.
Про число строк скажите, что ограничения обычно нет, а если его вводят, это намёк на короткое каноничное решение:
ListNode reverse(ListNode head) {
ListNode prev = null;
while (head != null) {
ListNode next = head.next;
head.next = prev;
prev = head;
head = next;
}
return prev;
}Время линейное, дополнительной памяти нет, новых узлов не создаётся. Назовите это вслух сами и добавьте, что рекурсивный вариант той же длины, но расходует стек на всю глубину списка.
Где спотыкаются
Пишут рекурсию и называют её решением за константную память. Кадры вызовов это тоже память, и на длинном списке она заканчивается ошибкой StackOverflowError: хвостовую рекурсию виртуальная машина в цикл не разворачивает.
Теряют ссылку на следующий узел. Присваивание head.next = prev до сохранения next обрывает список после первого шага, и обход завершается на втором узле. Проверять решение стоит на пустом списке и списке из одного узла, а не только на трёх элементах.
Путают задачу с готовым Collections.reverse. Речь про собственную структуру из узлов, а не про java.util.LinkedList, и упоминание библиотечного метода читается как попытка обойти вопрос, а не как знание стандартной библиотеки.