Я уже некоторое время работаю над Java-проектом для класса. Это реализация связанного списка (называемого здесь AddressList
, содержащего простые узлы ListNode
). Загвоздка в том, что все придется делать с помощью рекурсивных алгоритмов. Я мог делать все нормально без одного метода:public AddressList reverse()
ListNode:
public class ListNode{
public String data;
public ListNode next;
}
Сейчас моя reverse
функция просто вызывает вспомогательную функцию, которая принимает аргумент, разрешающий рекурсию.
public AddressList reverse(){
return new AddressList(this.reverse(this.head));
}
С моей вспомогательной функцией, имеющей подпись private ListNode reverse(ListNode current)
.
На данный момент он работает итеративно с использованием стека, но этого не требует спецификация. Я нашел алгоритм на языке C, который рекурсивно реверсировал и преобразовывал его в код Java вручную, и он работал, но я этого не понимал.
Изменить: Неважно, тем временем я понял это.
private AddressList reverse(ListNode current, AddressList reversedList){
if(current == null)
return reversedList;
reversedList.addToFront(current.getData());
return this.reverse(current.getNext(), reversedList);
}
Пока я здесь, кто-нибудь видит проблемы с этим маршрутом?
источник
Ответы:
В одном ответе есть код, который объясняет это, но вам может быть проще начать снизу вверх, задавая и отвечая на крошечные вопросы (это подход в The Little Lisper):
источник
Мне задали этот вопрос на собеседовании, и меня раздражало, что я возился с ним, потому что я немного нервничал.
Это должно перевернуть односвязный список, вызываемый с помощью reverse (head, NULL); так что, если бы это был ваш список:
edit: я сделал около 6 правок на этом, показывая, что это все еще немного сложно для меня lol
источник
Я прошел половину пути (до нуля и одного узла, как подсказывает плинтус), но потерял след после выполнения рекурсивного вызова. Однако, прочитав пост у плинтуса, я пришел к следующему:
источник
Вот еще одно рекурсивное решение. В ней меньше кода в рекурсивной функции, чем в некоторых других, поэтому она может быть немного быстрее. Это C #, но я считаю, что Java будет очень похожей.
источник
Алго должен работать на следующей модели,
Структура:
Код:
Вывод:
источник
Я думаю, что это более чистое решение, напоминающее LISP.
источник
Я знаю, что это старый пост, но большинство ответов не являются хвостовыми рекурсивными, т.е. они выполняют некоторые операции после возврата из рекурсивного вызова и, следовательно, не самые эффективные.
Вот хвостовая рекурсивная версия:
Звоните с:
источник
источник
источник
источник
источник
Обратный рекурсивным алгоритмом.
По итеративному
источник
Это решение демонстрирует, что никаких аргументов не требуется.
Вот вспомогательный код, демонстрирующий, что это работает:
источник
Вот простой итеративный подход:
А вот рекурсивный подход:
источник
Поскольку Java всегда передается по значению, чтобы рекурсивно перевернуть связанный список в Java, обязательно возвращайте «новый заголовок» (головной узел после реверсии) в конце рекурсии.
источник
PointZeroTwo получил элегантный ответ и то же самое в Java ...
источник
источник
вызов с использованием: head = reverseRec (null, head);
источник
То, что сделали другие ребята, в другом посте - это игра с контентом, то, что я сделал, - это игра со связанными списками, он меняет значение члена LinkedList, а не значение членов.
источник
источник
Решение такое:
}
источник
источник
источник
источник
источник
Вдохновленный статьей обсуждаются неизменяемые реализации рекурсивных структур данных, я собрал альтернативное решение, используя Swift.
Лучшее решение для ответных документов, в котором выделяются следующие темы:
Я назвал их там, где это возможно, в приведенном ниже решении.
источник
Переворачивание связанного списка с помощью рекурсии. Идея состоит в том, чтобы изменить ссылки, перевернув их.
источник
источник
источник
Вот ссылка, если кто-то ищет реализацию Scala:
источник