【问题标题】:Iterating from the end of a list从列表末尾迭代
【发布时间】:2015-10-01 09:54:03
【问题描述】:

我知道我们可以按以下相反的顺序遍历列表:

List<Object> lst;
ListIterator<Object> i = lst.listIterator(lst.size());

但是如果lstLinkedList 是否有效?我的意思是当我们获得指向列表末尾的ListIterator 时,实现是否会从乞求到list.size() 位置迭代列表(需要O(n) 时间,其中n 是列表的大小)?

如果是这样,有没有办法避免它?

【问题讨论】:

  • 是的,它确实会遍历列表列表,从乞求到list.size()
  • @AshwaniDausodia 所以,在 C++ 中我们有 reverse_iterator。如何在 Java 中高效完成?
  • @Satya 正如我在问题中提到的那样,他们提出了解决方案。
  • @St.Antario 你可以实现你自己的双向链表。

标签: java list


【解决方案1】:

javadoc 声明 LinkedList 是一个双向链表,所以我希望 descendingIterator(),它返回一个指向列表尾部的迭代器,是 O(1)。注意descendingIterator来自Deque接口。

现在很难说lst.listIterator(lst.size()) 语句是否也是O(1),因为如果listIterator 方法优化了lst.size() 的下一个元素是尾部这一事实,则没有记录。

【讨论】:

  • 所以,我们只需要使用它是一个双端队列这一事实,谢谢。
【解决方案2】:

文档指出LinkedList“List 和 Deque 接口的双向链接列表实现”。所以列表中的每个元素都有对下一个和前一个元素的引用。所以,迭代器在逆序中应该和在自然顺序中一样快。

【讨论】:

    【解决方案3】:

    它不会遍历列表来生成迭代器。

    寻找这些解决方案的最佳地点是Source Code

      if (index < (size >> 1)) {
              next = header.next;
              for (nextIndex=0; nextIndex<index; nextIndex++)
                  next = next.next;
          } else {
              next = header;
              for (nextIndex=size; nextIndex>index; nextIndex--)
                  next = next.previous;
          }
    

    如您所见,它将尝试使用从第一个节点或最后一个节点开始的最短路径到达索引。

    【讨论】:

      【解决方案4】:

      LinkedList 也实现了 Deque 接口。

      所以如果你把它实现为

      Deque list = new LinkedList();
      

      或者如果您还需要列表方法

      LinkedList list = new LinkedList();
      

      你可以使用

      list.descendingIterator();
      

      【讨论】:

        【解决方案5】:

        您的代码不起作用,索引lst.size() 超出范围,也许您的意思是lst.size()-1。但它仍然不是反向迭代器,它是一个正向迭代器,而不是从 0 开始,而是从您指定的元素开始。在这种情况下,您将只读取最后一个元素然后到达末尾。

        LinkedList 实现接口Deque,它提供Deque.descendingIterator。在这种情况下,实例化迭代器和移动到下一个(前一个)元素都是O(1) 操作。在第一种情况下,因为Deque 实现保留了对队列开头和结尾的引用,在第二种情况下,因为LinkedList 是一个双向链表,其中每个元素都保留对其后继者的引用和他的前任。

        【讨论】:

        • 现在我明白了,你这样实例化它来迭代previous()。在这种情况下,是的,它可以工作。但是为了确定复杂性,我会使用 Deque.reverseIterator(),即使最后他们应该执行相同的操作。
        • IndexOutOfBoundsException - if the index is out of range (index &lt; 0 || index &gt; size())
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-16
        • 1970-01-01
        • 2017-05-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多