#java
#java
Вопрос:
Я пытаюсь реализовать это рекурсивно, но он не возвращает правильный связанный список со всеми правильными узлами.
Я попытался распечатать узел после рекурсивного вызова, и это дало мне правильный связанный список в обратном порядке, но по какой-то причине, когда я возвращаю head, это не работает.
public Node<E> insertNodeAtPosition(Node<E> head,E element,int position)
{
Node<E> node = new Node<E>(element,null);
if(head==null){
return node;
}
if(position==0)
{
Node<E> current = head;
head = node;
head.next = current;
}
insertNodeAtPosition(head.next,element,position-1);
return head;
}
Я ожидаю, что вывод будет включать вставленный узел, но он там не отображается
Ответ №1:
Этот код:
public static <E> Node<E> insertNodeAtPosition(Node<E> head, E element, int position) {
return insertNodeAtPosition(null, head, element, position);
}
private static <E> Node<E> insertNodeAtPosition(Node<E> prev, Node<E> head, E element, int position) {
if (position == 0) {
Node<E> newNode = new Node<>(element, null);
if (prev != null) {
prev.next = newNode;
}
newNode.next = head;
return newNode;
}
return insertNodeAtPosition(head, head.next, element, position - 1);
}
Вернет только что вставленный узел.
РЕДАКТИРОВАТЬ: без дополнительного метода:
private static <E> Node<E> insertNodeAtPosition(Node<E> prev, Node<E> head, E element, int position) {
if (position == 0) {
Node<E> newNode = new Node<>(element, null);
if (prev != null) {
prev.next = newNode;
}
newNode.next = head;
return newNode;
}
return insertNodeAtPosition(head, head.next, element, position - 1);
}
Комментарии:
1. Почему вы сделали это вспомогательной функцией и добавили другой параметр, и как я могу узнать, как это сделать? и было бы возможно ли это без дополнительного параметра в вспомогательной функции?
2. 1) Сделано предположение, что ваши узлы знают только о «следующем», а не о «предыдущем» (распространенная проблема в SO). 2) Вам нужно знать «предыдущий», потому что вам нужно установить его рядом с новым заголовком. 3) Отредактировано, чтобы удалить «вспомогательную» функцию; вам нужно будет решить, как передать предыдущее значение (которое может быть null) в этом случае. 4) Пошагово просмотрите код в отладчике или добавьте инструкции log, чтобы помочь вам понять, что происходит, когда — это тривиальная рекурсия.
3. Что вы подразумеваете под SO?