Java实现List反转的代码为何无法正常运行?
代码无法正确运行的原因
这段反转List的代码核心错误是把存储列表初始长度的变量n同时作为循环终止判断依据、右索引计算基准,还在循环内执行n--修改边界值,导致循环提前终止,部分偶数长度的列表会出现中间元素未交换的问题,反转结果不符合预期。
以长度为6的输入列表[1,2,3,4,5,6]为例,代码实际执行流程如下:
- 初始n=6,循环变量i从0开始
- i=0时,满足
i < 6/2=3的循环条件:交换索引0和索引5的元素,列表变为[6,2,3,4,5,1],执行n--后n=5 - i=1时,满足
i < 5/2=2.5的循环条件:交换索引1和索引4的元素,列表变为[6,5,3,4,2,1],执行n--后n=4 - i=2时,判断
i < 4/2=2不成立,循环直接结束 - 最终返回结果为
[6,5,3,4,2,1],中间位置的3和4没有完成交换,反转失败。
修正后的实现
两种无bug的实现方式可选:
方案1:保留原循环结构,移除循环内对n的修改
不需要动态修改n,右索引直接通过初始长度计算即可:
import java.util.List; public class Main{ public static List<Integer> reverseArray(List<Integer> a){ int n = a.size(); int temp; for (int i = 0; i < n/2; i++){ int rightIndex = n - 1 - i; temp = a.get(rightIndex); a.set(rightIndex, a.get(i)); a.set(i, temp); } return a; } }
方案2:双指针写法,逻辑更直观
单独定义左右指针,移动逻辑和循环条件完全解耦,不容易出边界错误:
import java.util.List; public class Main{ public static List<Integer> reverseArray(List<Integer> a){ int left = 0; int right = a.size() - 1; int temp; while (left < right){ temp = a.get(right); a.set(right, a.get(left)); a.set(left, temp); left++; right--; } return a; } }
内容的提问来源于stack exchange,提问作者Youssef Sultan
相关产品推荐
相关产品推荐

