迭代器从第i个元素开始
如果您创建一个直接从LinkedList的第i个索引处开始的Iterator,您需要知道这也需要O(n).在LinkedList中查找元素总是很慢.
LinkedList只记忆列表的head(和tail)元素.遍历整个列表需要找到每个其他元素.
这是一个双向链表的例证(Javas LinkedList也是双重链接):
因此,如果您从第i个元素开始创建一个Iterator,它将从头部(或尾部)开始,并按照指针指向第i个元素.这就像打电话:
list.get(i);
这显然花费了O(n).
替代方案:ArrayList
如果您需要基于索引的快速访问(也称为随机访问),则可以考虑使用ArrayList.它的结构允许在O(1)中访问(它可以通过start i * sizeof(type)直接计算元素在内存中的位置).
提供这种快速随机访问的数据结构通常将接口RandomAccess(documentation and implementing classes)实现为指示符.
如何迭代
如上所述,迭代LinkedList应该不是通过list.get(i)通过基于索引的访问来完成的.因此,如果需要在迭代时修改列表,则应使用Iterator(或ListIterator).
以下是使用迭代器的常用方法:
Iterator iter = list.iterator();
while (iter.hasNext()) {
E element = iter.next();
...
}
或者你也可以使用增强的for循环,它在内部做同样的,但看起来更紧凑:
for (E element : list) {
...
}
由于Javas LinkedList是一个双向链表,您也可以从尾部开始并反向迭代列表.因此,只需使用LinkedList#descendingIterator方法(documentation)而不是LinkedList#iterator.
最后一个示例演示如何在迭代时使用ListIterator修改列表:
ListIterator listIter = list.listIterator(0);
while (listIter.hasNext()) {
E element = listIter.next();
...
// Remove the element last polled
listIter.remove();
// Inserts an element right before the last polled element
listIter.add(new Element());
}
您还可以使用hasPrevious()和previous()方法使用ListIterator向前和向后遍历列表.这是它的documentation.