Я использую рекурсию для вставки узла в конец связанного списка. Код работает нормально. Но я немного смущен обратными заявлениями.Путаница для операторов возврата при использовании рекурсии
Проходя по одному из моего понимания:
Первое возвращение вернет новый узел head == null
и функция финиширует - больше ничего не делать
Второй возвращает узел, который был создан в конец хвоста - ничего больше не нужно делать
Последний будет помещать все узлы в стек каждый раз, когда insertNodeAtTail вызывается рекурсивно. Когда второе возвращение называется head.next == null
. Все узлы будут удалены из стека, пока не дойдут до первого. Эффективно являясь первым узлом в связанном списке (указывая на голову).
Правильно ли я понимаю?
public Node insertNodeAtTail(Node head, int data) {
if(head == null) {
/* List is empty so just return the new node */
Node node = new Node();
node.data = data;
node.next = null;
return node;
}
else if (head.next == null) {
/* We are at the end of the list so insert the new node */
Node node = new Node();
node.data = data;
head.next = node;
return head;
}
else {
/* Travese the list by passing the next node in the list until next is NULL */
insertNodeAtTail(head.next, data);
}
/* This will put all the head nodes on the stack and then pop them off at the end */
return head;
}
Большое спасибо за любые предложения,
Да, ваше понимание правильно. Я не уверен, какова точка возвращаемого значения, она не используется. – Zarwan
@ Zar, вероятно, существует для извлечения корневого узла каждый раз, когда что-то добавляется, поскольку корневой узел всегда будет возвращен. – EvilTak
Обратите внимание, что первый случай ('head == null') ничего не добавляет к списку (т. Е. Если вы не назначили узел, возвращенный вашим методом, члену' head' вашего списка, если вы этого не сделаете сделайте это, ваш метод не работает для пустых списков) – Eran