Я пытался использовать рекурсию, чтобы отменить LinkedList, но я получил странный результат, следующий мой код:Реверсирование LinkedList в Java
import java.util.LinkedList;
import java.util.List;
/**
* Created by liqiushi on 2/6/14.
*/
public class ReverseLinkedList {
public static void main(String[] args) {
List<Integer> list = new LinkedList<Integer>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
reverse(list, 0);
for (int i : list) {
System.out.println(i);
}
}
private static void reverse(List<Integer> list, int index) {
if (list == null)
return;
if (index == 5) {
return;
}
int currentVal = list.get(0);
list = list.subList(1, list.size());
index += 1;
reverse(list, index);
list.add(currentVal);
}
}
результат для исполнения является: 1 2 3 4 5 5 4 3 2 1, где я ошибся?
P.S. Я попытался проанализировать временную сложность этого алгоритма, я думаю, что он должен быть O (n), поскольку он просто рекурсирует 4 раза, подобно дереву, в котором каждый узел имеет только один левый или правый дочерний элемент, исправьте меня, если я ошибаюсь.
Вы пробовали пройти через него в отладчике? – Jason
'subList' возвращает вид, который подкрепляется оригинальным списком. Если вы что-то сделаете, это также повлияет на исходный список. Только потому, что вы изменили локальную ссылку «list» на это представление, это не означает, что этот список изменений содержит только выбранные элементы. Чтобы увидеть это, взгляните на результат 'list.subList (1, 2) .add (10);'. Пока вы добавляете только элементы этого вида, не удаляя их. – Pshemo
@Pshemo Большое спасибо за указание: D – photosynthesis