2015-09-23 2 views
3

Вот кодJava рекурсивный о движении задним ходом единого списка

public static ListCell reverse(ListCell f) { 
    if (f==null) 
     return null; 
    else if (f.getNext()==null) 
     return f; 
    else { 
     ListCell head = reverse(f.getNext()); 
     f.getNext().setNext(f); 
     f.setNext(null); 
     return head; 
    } 
} 

Я смущен о f.setNext(null). Рассмотрим второй рекурсивный вызов, reverse(f.getNext()). Но f.getNext().next должно быть f, а не null. В этом предложении каждый node.next будет установлен null. Так что я немного запутался

+1

Это ваш код или что-то, что вы нашли? –

+0

Это правильный код, над которым я работаю. – codemonkey

+0

Вы получаете правильный ожидаемый результат? – rajuGT

ответ

0

При входе в функцию реверса функция рекурсивно вызывает сама себя, пока параметр F не является последним элементом списка (обозначенном f.getNext() == null)

Пример такого списка a -> b -> c

Первый время f.getNext().setNext(f) будет оценено f - второй последний элемент списка, а голова - последний элемент. head = reverse(f.getNext()) голова будет c Когда f.getNext().setNext(f) называется f указывает на ListCell b в приведенном примере. Так вот, как этот звонок b.getNext().setNext(b) Список выглядит следующим образом a-> b <- c после b.setNext(null). После этого функции возвращают c, потому что head указывает на c.

После подъема стека head по-прежнему указывает на c, потому что его возвращает рекурсивный вызов, но f равен a.

Таким образом, a.getNext().setNext(a) установит следующее значение b, поскольку a.getNext() по-прежнему указывает на b. После a.setNext(null) этот список выглядит как c->b->a

+0

Когда первый раз вступает в случай else, я думаю, что f должен быть первым элементом, я прав? – codemonkey

+0

Да, но он будет рекурсивно вызывать реверсивную функцию, пока условие f.getNext() == null не будет оценено как true. Я обновлю ответ ... – user