java - 使用 ListIterator 将元素添加到 LinkedList 中

标签 java collections linked-list listiterator

在使用 java 中的 ListIterator 将元素添加到 LinkedList 时,我需要一些帮助来理解底层行为。 请看下面的代码:

这里,graphQueue 最初只有一个节点。该节点有三个子节点,它们也是节点。 我的逻辑是删除主节点并将其子节点添加到 graphQueue 中以迭代它们并将其子节点添加到队列中等等...... 假设我有 vertex 0 已添加到队列中;它有三个子级 2、3 和 5。我将从队列中删除 0,并将 2、3 和 5 添加到队列中。

ListIterator<Node> it = graphQueue.listIterator();
while (it.hasNext())
{
   Node node = it.next();
   it.remove();

   if (node.hasChildren())
   {
      for (Node child : node.getChildren())
      {
         it.add(child);
      }
   }
}

现在的问题是循环在第一个循环后退出,但如果我在这个 while 循环周围再放置一个 do while 循环并再次创建 Iterator 对象,它就会起作用。请看下面的代码:

ListIterator<Node> it = graphQueue.listIterator();
do
{
  while (it.hasNext())
  {
     Node node = it.next();
     it.remove();

     if (node.hasChildren())
     {
        for (Node child : node.getChildren())
        {
           it.add(child);
        }
     }
  }

  it = graphQueue.listIterator();
} while(it.hasNext());

我错过了什么吗?谢谢!

最佳答案

根据documentation ListIterator.add() 将您添加的元素放置在迭代器的下一个元素之前。这意味着即使您通过添加元素来修改列表,当前的迭代器也不会考虑它的遍历。这就是为什么你的迭代在第一次循环后停止。

在你的第二个场景中。您有两个嵌套循环,在内循环结束时为列表创建一个新的迭代器。这个迭代器是一个新的迭代器,它再次从列表的开头开始。所以这段代码按照您的预期工作。

关于java - 使用 ListIterator 将元素添加到 LinkedList 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35762673/

相关文章:

java - 用于嵌入的 Headless JDK7

java - VSCode MacOS 上的路径 JRE

go - 在 golang 中实现通用链表,它不允许在同一链表中使用不同类型

c - 链接列表有一个指向所需数据的指针

arrays - 不会为集合的元素推断协议(protocol)一致性

java - 插入后如何在链表中的节点之间建立连接

java - token 语法错误

java - Qt - 包 android.support.v4.app 不存在

C# 集合 - 按元素排序(旋转)

Backbone.js 如何在集合中随机排列项目