求助:使用ListIterator反转列表且修改原列表的实现问题
解决ListIterator原地反转List的问题
我懂你现在的困境:必须用ListIterator实现List的原地反转,不能依赖Collections.reverse()这类工具方法,也不能新建集合或额外字段,直接修改输入的List。你的代码没生效,大概率是漏掉了元素交换的核心操作——只移动了迭代器但没替换元素。
核心实现思路
要完成原地反转,我们需要两个ListIterator配合:一个从列表头部正向遍历,一个从列表尾部反向遍历,交换两个迭代器指向的元素,直到两个迭代器相遇或交叉(避免重复交换)。
完整可运行代码
public static <T> List<T> reverse(List<T> input) { // 正向迭代器:从列表起始位置开始 ListIterator<T> forwardIter = input.listIterator(); // 反向迭代器:从列表末尾位置开始 ListIterator<T> backwardIter = input.listIterator(input.size()); // 循环交换元素,直到两个迭代器相遇 while (forwardIter.hasNext() && backwardIter.hasPrevious()) { T forwardElem = forwardIter.next(); T backwardElem = backwardIter.previous(); // 处理列表长度为奇数的情况:中间元素无需交换,直接终止循环 if (forwardIter.nextIndex() == backwardIter.nextIndex()) { break; } // 替换两个迭代器指向的元素,实现原地交换 forwardIter.set(backwardElem); backwardIter.set(forwardElem); } return input; }
关键细节说明
set()方法的作用:ListIterator的set()方法是原地修改的核心,它会替换迭代器最后一次通过next()/previous()访问的元素,这也是你之前代码缺失的关键步骤。- 边界条件处理:当
forwardIter.nextIndex()等于backwardIter.nextIndex()时,说明已经遍历到列表中间(奇数长度的情况),此时停止交换,避免重复操作。 - 迭代器越界防护:循环条件同时判断两个迭代器的遍历状态,确保不会出现越界访问的问题。
测试验证
比如输入[1,2,3,4,5],执行后原List会被直接修改为[5,4,3,2,1];输入["apple","banana","cherry"],会变成["cherry","banana","apple"],完全满足原地修改的要求。
内容的提问来源于stack exchange,提问作者Anton Moog
相关产品推荐
相关产品推荐

