【问题标题】:Java LinkedList iterator: Remove current element and all elements after itJava LinkedList迭代器:删除当前元素及其之后的所有元素
【发布时间】:2018-09-08 16:47:16
【问题描述】:

从理论上讲,LinkedList 允许您在恒定时间内轻松删除列表的尾部,只需将删除的引用设置为 null。

在实践中,Java 的 LinkedList 是如何让你做到这一点的?

例如:

Iterator<Integer> iterator = linkedList.iterator();
while (iterator.hasNext()) {
  if (iterator.next() % 2 == 0) {
    iterator.removeAllAfterThisPoint(); // how can we do this?
  }
}

【问题讨论】:

  • 首先,您发布的示例是错误的。 someList.iterator() 返回一个Iterator&lt;E&gt;,假设列表包含整数,您的情况将是Iterator&lt;Integer&gt;。你的问题也不是很清楚。您想基本上删除之后的所有元素?
  • 在恒定时间的任何点之后删除所有元素,就像链表可以让你做的那样。例如对于像 1 -> 2 -> 3 -> 4 这样的列表,您只需将 2 上的 next 引用设置为 null 即可从列表中删除 3 -> 4。
  • 坦率地说:API不允许让你这样做。不支持您想要的方式。

标签: java data-structures linked-list


【解决方案1】:

如果我理解您的问题,您正试图从LinkedList 中删除第一个偶数之后的所有元素。我的解决方案是获取偶数出现的索引,并使用subList(fromIndex, toIndex) 删除toIndex 之后的所有元素。

public static void main(String[] args) {
        List<Integer> list = new LinkedList<>(Arrays.asList(3, 7, 9, 2, 4, 5, 17));
        ListIterator<Integer> iterator = list.listIterator();
        int toIndex = 0;
        while (iterator.hasNext()) {
            if (iterator.next() % 2 == 0) {
                toIndex = iterator.nextIndex();
                break;
            }
        }
        list = list.subList(0, toIndex);
        list.forEach(System.out::println);
    }

输入:

3
7
9
2
4
5
17

输出:

3
7
9
2

【讨论】:

  • 是的,但这不是在 LinkedList 上花费 O(n) 时间吗? LinkedList 的一个特性不是我们可以在恒定时间内删除列表的指定尾部吗?
  • 是的,但不幸的是,我们在 Java LinkedList API 中没有方法来执行您所说的操作。
  • 检查这个答案以及问题:stackoverflow.com/a/30081299/3888766
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 2013-03-23
  • 2020-12-08
  • 2020-05-10
  • 2011-03-09
  • 2019-05-15
相关资源
最近更新 更多