Я использую для удобства Stack для его метода pop.
public static List<Integer> reverse(List<Integer> input) {
Stack<Integer> stack = new Stack();
stack.addAll(input);
return reverse(stack,new LinkedList<>());
}
public static List<Integer> reverse(Stack<Integer> input,LinkedList<Integer> output) {
if (input.isEmpty()) {
return output;
}
output.addFirst(input.pop());
reverse(input, output);
return output;
}
Если вы хотите пропустить повторное добавление элементов, вам необходимо поддерживать индекс или использовать LinkedList, который знаетиз первого и последнего элемента.Вот с сохранением индекса и чистого API списка:
public static List<Integer> reverse(List<Integer> input) {
return reverse(input,new LinkedList<>(),0);
}
public static List<Integer> reverse(List<Integer> input,LinkedList<Integer> output,int index) {
if (index == input.size()) {
return output;
}
output.addFirst(input.get(index));
reverse(input, output,++index);
return output;
}