Java中LinkedList的迭代器时间复杂度?

Hoshang Charania:

下面的代码将调用迭代器,并将整数发送回调用它的方法。我只是想知道是否通过使用a Iterator可以使我的时间复杂度保持不变?(即O(1))。因为如果我将get与a一起使用LinkedList,它将给我线性时间(即O(n))。

protected int least(int i) {
    if(i >= digits.size()) {
        return 0;           
    }

    // temp++;
    // System.out.println("Time taken=" + temp);
    // long start = System.nanoTime();

    ListIterator<Integer> itr1 = digits.listIterator(digits.size() - i);

    // System.out.println("Time elapsed:" + (System.nanoTime() - start));

    return itr1.previous();
}
扎布扎德:

从第i个元素开始的迭代器

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

LinkedList只是记住head(和tail列表)元素。其他所有元素都需要遍历整个列表来找到

这是一个双向链接列表的图示(Java LinkedList也是双向链接):

LinkedList的结构

因此,如果您Iteratori-th元素创建起始位置,则它将在head(或tail处起始并跟随指针直至i-th元素。就像调用:

list.get(i);

这显然要付出代价O(n)


备选:ArrayList

如果您需要基于索引的快速访问(也称为random-access),则可以考虑使用ArrayList它的结构允许访问O(1)(它可以通过来直接计算元素在内存中的位置start + i * sizeof(type))。

提供这种快速随机访问的数据结构通常将接口RandomAccess文档和实现类实现为指示符。


如何迭代

如前所述LinkedList,不应通过进行基于索引的访问来迭代a list.get(i)因此,您应该使用Iterator(或ListIterator如果需要在迭代时修改列表)。

这是使用的通常方法Iterator

Iterator<E> iter = list.iterator();
while (iter.hasNext()) {
    E element = iter.next();
    ...
}

或者,您也可以使用增强的for循环,该循环内部执行相同的操作,但看起来更紧凑:

for (E element : list) {
    ...
}

由于Java LinkedList双向链接的列表,因此您也可以从尾部开始,然后反向迭代该列表因此,只需使用LinkedList#descendingIterator方法(文档)代替LinkedList#iterator

最后是一个示例,显示了如何ListIterator在迭代时用于修改列表:

ListIterator<E> 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());
}

您也可以ListIterator使用hasPrevious()previous()方法前后遍历列表这是它的文档

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章