【问题标题】:Adding elements into a LinkedList using ListIterator使用 ListIterator 将元素添加到 LinkedList
【发布时间】:2016-03-03 03:32:31
【问题描述】:

在使用 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());

我错过了什么吗?谢谢!

【问题讨论】:

    标签: java collections linked-list listiterator


    【解决方案1】:

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

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

    【讨论】:

    • 文档说-“该元素被插入到 next() 返回的元素之前,如果有的话,在之前的元素之后插入,如果有的话。”在我的情况下,列表中没有元素,因为我在 add() 之前执行删除操作,所以你能更清楚地解释我会发生什么吗?
    • 此外,我添加了三个元素,根据定义,至少指针应该指向我添加的第二个元素。啊!或者是所有三个节点都在下一个指针之前添加?如果是这样,我应该怎么做才能确保指针指向第一个元素?
    • 是的,所有三个节点都刚刚添加到下一个指针之前。无论添加多少节点,迭代器的下一个节点都是相同的。我刚刚向您解释了为什么您的两段代码的行为不同。我想这就是你问的。但我不清楚您对这段代码的最终目标。您的目标是遍历树的所有节点吗?如果是这种情况,那么您可以采取其他方法,例如递归树遍历方法。
    • 是的!谢谢你,现在我已经清楚那里发生了什么。而且我不是在为我正在做的事情寻找完整的解决方案,我正在探索集合,我正在尝试使用 LinkedList 和 ListIterator。现在我理解了这个 Java 概念,我将不得不重新编写逻辑。谢谢!最后一个问题 - 有没有办法让迭代器对象指向我想要的位置?比如让指针指向第一个位置。
    • 您可以在it.add(child); 之后添加it.previous(); 调用以将迭代器移动到您想要的位置
    猜你喜欢
    • 2013-10-01
    • 2012-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    相关资源
    最近更新 更多