descendingIterator()返回ListIterator实例,仅支持反向遍历:hasNext()恒返false,next()抛UnsupportedOperationException,仅允许hasPrevious()、previous()等反向操作。

descendingIterator() 是 LinkedList 提供的专属逆序遍历工具,它不创建新集合,也不复制数据,而是直接从链表尾部出发,逐个访问节点,时间复杂度为 O(1) 启动、O(1) 单步移动,天然适配双向链表结构。
它返回什么类型的迭代器
返回一个 ListIteratorhasNext() 始终返回 false(因设计上不走正向)
- next() 方法抛出 UnsupportedOperationException
- 只能安全使用 hasPrevious()、previous()、previousIndex() 等反向操作
为什么能高效逆序遍历
得益于 LinkedList 底层是双向链表,每个节点都持有 prev 引用:
- 迭代器内部以 last(尾节点)为起点,无需遍历整个链表定位
- 每次调用 previous() 仅需一次指针跳转:next = next.prev
- 即使链表很长,从末尾倒着取前 3 个元素,也只需 3 次指针操作,不依赖索引计算
使用时要注意的细节
- 迭代器是快速失败(fail-fast)的:若在遍历过程中用
add()、remove()等方法修改链表结构(除迭代器自身的remove()),会立即抛出ConcurrentModificationException -
previous()在到达开头时抛NoSuchElementException,判断依据是nextIndex == 0 - 不能混用正向与反向迭代器修改同一链表,否则容易触发并发检查失败
- 适用于需要“后进先出”语义的场景,比如回滚操作、日志倒查、表达式求值中的右结合运算等
一个简洁可用的例子
List
Iterator
while (di.hasNext()) {
System.out.print(di.next() + " "); // 注意:这里调用的是 next(),但实际由 descendingIterator 重定向为 previous() 行为
}
// 输出:c b a


















