Java双向链表时间复杂度,迭代器Java中LinkedList的时间复杂度?

迭代器从第i个元素开始

如果您创建一个直接从LinkedList的第i个索引处开始的Iterator,您需要知道这也需要O(n).在LinkedList中查找元素总是很慢.

LinkedList只记忆列表的head(和tail)元素.遍历整个列表需要找到每个其他元素.

这是一个双向链表的例证(Javas LinkedList也是双重链接):

0bc9263757393627b12bff7cc83c9b83.png

因此,如果您从第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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值