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條經驗 獲得超16個贊
首先,如果它是一個實用方法,為什么要存儲參數,如果不是,那么為什么它是靜態的。您也不需要多個實例,因為 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);
}
}
添加回答
舉報