2 回答
TA贡献1799条经验 获得超6个赞
假设是你。
想要递归地做
不想破坏原来的列表。
并且不想在方法外部分配新的列表。
您可以执行以下操作:
public static <E> List<E> reverse(List<E> inputList) {
List<E> ret = new ArrayList<>();
E o = inputList.remove(0);
if (inputList.size() > 0) {
ret = reverse(inputList);
}
// at this point they will be on the stack in reverse order.
// so add them to the stack in that order.
ret.add(o);
// return the orginal list to its initial state by inserting them at the beginning.
inputList.add(0, o);
return ret;
}
用这个打电话。
List<Integer> ints = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
System.out.println(reverse(ints));
System.out.println(ints);
产生此输出。
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
当然,非递归解决方案是微不足道的。
注意:传递的列表必须支持List.remove()并使其mutable起作用。如果使用List.of()或声明列表,则Arrays.asList()必须将列表作为参数传递给ArrayList<>()构造函数。
TA贡献1801条经验 获得超15个赞
首先,如果它是一个实用方法,为什么要存储参数,如果不是,那么为什么它是静态的。您也不需要多个实例,因为 java 中的方法参数是按引用传递的。更重要的是,递归意味着您的列表将受到调用堆栈限制。
public static <E> void reverse(List<E> list) {
for (int i=0;i<list.size()/2;i++) {
E temp = list.get(i);
list.set(i, list.get(list.size()-i-1));
list.set(list.size()-i-1, temp);
}
}
添加回答
举报