可利用listiterator的hasprevious()和previous()方法实现列表逆向遍历,初始游标在索引0前时hasprevious()返回false,移至末尾后循环调用previous()即可安全高效地从后往前访问元素。

可以利用 ListIterator 的 hasPrevious() 和 previous() 方法,对支持双向迭代的列表(如 ArrayList、LinkedList)实现从末尾向前的游标式遍历,无需反转原集合或额外索引计算。
理解 hasPrevious() 的作用时机
hasPrevious() 判断当前游标位置**前方是否存在元素**——注意这里的“前”是逻辑上的前,即更靠近索引 0 的方向。它不依赖当前是否刚调用过 next(),而是由游标当前位置决定:
- 初始时(游标在索引 0 前),
hasPrevious()返回false - 调用一次
next()后,游标位于索引 0 和 1 之间,此时hasPrevious()返回true(因为索引 0 元素在游标“前面”) - 调用
previous()后,游标左移,hasPrevious()再次检查左侧是否还有元素
标准逆向遍历写法(推荐)
最常用且安全的方式:先将游标移到末尾,再逐个 previous()。适用于任意 List 实现:
List<string> list = new ArrayList(Arrays.asList("a", "b", "c", "d"));
ListIterator<string> lit = list.listIterator(list.size()); // 游标置于末尾后
while (lit.hasPrevious()) {
String item = lit.previous(); // 每次取前一个,自动左移游标
System.out.println(item); // 输出: d, c, b, a
}</string></string>
边遍历边修改的安全要点
若需在逆向遍历时删除或添加元素,必须使用 ListIterator 自身方法,避免 ConcurrentModificationException:
- 删除当前已获取的元素:调用
lit.remove()(上一次next()或previous()返回的元素) - 在游标前插入:用
lit.add(x),新元素成为新的“前一个”元素 - 禁止使用
list.remove()或增强 for 循环,会破坏迭代器一致性
与普通 for 逆序遍历的区别
相比 for (int i = list.size()-1; i >= 0; i--):
-
ListIterator是面向游标的抽象,不暴露索引,更契合“遍历行为”语义 - 天然支持在遍历中增删(
add/remove/set),索引方式需手动调整i - 对
LinkedList,previous()是 O(1),而随机索引访问是 O(n),性能更优










