Как вывести правильный связанный список при рекурсивной вставке узла в определенную позицию в односвязном списке?

#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?