使用ListIterator将元素添加到LinkedList中

时间:2016-03-03 03:32:31

标签: java collections linked-list listiterator

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

此处,graphQueue最初只有一个节点。那节点有三个子节点也是节点。 我的逻辑是删除主节点并将其子节点添加到graphQueue中以迭代它们并将其子节点添加到队列中等等...... 我们说我有vertex 0被添加到队列中;它有三个孩子2,3,和我从队列中删除了0,我正在添加2,3和2。 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循环中再放一个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());

我错过了什么吗?谢谢!

1 个答案:

答案 0 :(得分:2)

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

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