2 回答

TA貢獻(xiàn)1799條經(jīng)驗(yàn) 獲得超6個(gè)贊
假設(shè)是你。
想要遞歸地做
不想破壞原來的列表。
并且不想在方法外部分配新的列表。
您可以執(zhí)行以下操作:
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;
}
用這個(gè)打電話。
List<Integer> ints = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
System.out.println(reverse(ints));
System.out.println(ints);
產(chǎn)生此輸出。
[5, 4, 3, 2, 1]
[1, 2, 3, 4, 5]
當(dāng)然,非遞歸解決方案是微不足道的。
注意:傳遞的列表必須支持List.remove()并使其mutable起作用。如果使用List.of()或聲明列表,則Arrays.asList()必須將列表作為參數(shù)傳遞給ArrayList<>()構(gòu)造函數(shù)。

TA貢獻(xiàn)1801條經(jīng)驗(yàn) 獲得超16個(gè)贊
首先,如果它是一個(gè)實(shí)用方法,為什么要存儲(chǔ)參數(shù),如果不是,那么為什么它是靜態(tài)的。您也不需要多個(gè)實(shí)例,因?yàn)?java 中的方法參數(shù)是按引用傳遞的。更重要的是,遞歸意味著您的列表將受到調(diào)用堆棧限制。
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);
}
}
添加回答
舉報(bào)