2016-09-27 3 views
1

Я использую рекурсию для вставки узла в конец связанного списка. Код работает нормально. Но я немного смущен обратными заявлениями.Путаница для операторов возврата при использовании рекурсии

Проходя по одному из моего понимания:

Первое возвращение вернет новый узел 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; 
} 

Большое спасибо за любые предложения,

+0

Да, ваше понимание правильно. Я не уверен, какова точка возвращаемого значения, она не используется. – Zarwan

+0

@ Zar, вероятно, существует для извлечения корневого узла каждый раз, когда что-то добавляется, поскольку корневой узел всегда будет возвращен. – EvilTak

+0

Обратите внимание, что первый случай ('head == null') ничего не добавляет к списку (т. Е. Если вы не назначили узел, возвращенный вашим методом, члену' head' вашего списка, если вы этого не сделаете сделайте это, ваш метод не работает для пустых списков) – Eran

ответ

3

Просто сделать это

public Node insertNodeAtTail(Node head, int data) { 
if(head == null) { 
    head = new Node(data); 
} 
else{ 
    head.next = insertNodeAtTail(head.next,data); 
} 
return head; 
} 
+0

Я переместил возвратную голову внутри оператора else, и код работает нормально. Я знаю, что это работает. Но все еще путают с head.next = insertNodeAtTail (head.next, data); Что вернет эту вставкуNodeAtTail? – ant2009

+1

Он добавит узел в конце списка и вернет голову в конец. – FallAndLearn

2

Вы просто положить возвращение в неправильном месте, возвратившись же головной элемент.

else { 
/* Travese the list by passing the next node in the list until next is NULL */ 
    return insertNodeAtTail(head.next, data); 
} 

Im записывая это из головы, пожалуйста, проверьте.

+0

На самом деле я попробовал это, и функция разбилась с нулевым исключением. – ant2009

1

Да, ваше понимание правильно ... :)

1

Последнее возвращение вызовет проблемы, поскольку это приведет к Head всегда указывает на второй последний узел из списка. Вы должны удалить это, как было предложено FallAndLearn. Поправьте меня, если я ошибаюсь.

+0

Исходный код, который я написал в моем вопросе, преуспел в моих тестовых случаях, поэтому он всегда будет возвращать первую голову в начале, так как все узлы будут выбиты из стека, а последний, который будет выбит из стека, будет первым один. Таким образом, голова будет указывать на первый узел. – ant2009

Смежные вопросы