2016-03-03 100 views
0

我需要在添加元素時到一個LinkedList在Java中使用的ListIterator瞭解底層的行爲的一些幫助。 請看下面的代碼:添加元素融入一個LinkedList使用的ListIterator

在這裏,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循環迴路和創建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()); 

我錯過了什麼嗎?謝謝!

回答

2

ListIterator.add()你添加的元素的documentation被放置在迭代器的下一個元素之前。這意味着即使您通過添加元素來修改列表,當前的迭代器也不會考慮它的遍歷。這就是爲什麼你的迭代在第一次循環後停止。

在你的第二個方案。你有兩個嵌套循環,在內循環結束時爲列表創建一個新的迭代器。這個迭代器是一個新的,它從列表的開頭再次開始。所以這段代碼按照你的預期工作。

+0

文檔中說 - 「的元素,將在明年(如果有的話)所返回元素前立即插入,並會由以前的(),如果任何返回的元素之後。」在我的情況下,列表中沒有元素,因爲我在add()之前執行刪除操作,所以你能更清楚地解釋我會發生什麼? –

+0

此外,我添加了三個元素,根據定義,至少指針應該指向我添加的第二個元素。啊!還是說所有三個節點都是在下一個指針之前添加的?如果是這樣,我應該怎麼做才能確保指針指向第一個元素? –

+2

是的所有三個節點剛添加在下一個指針之前。無論您添加的節點數量多少,迭代器的下一個節點都是相同的。我剛剛給你解釋了爲什麼你的兩段代碼的行爲有所不同。我想這就是你問的。但是對於我來說這個代碼的最終目標並不明確。你的目標是遍歷樹的所有節點嗎?如果是這種情況,那麼您可以採用其他方法,例如遞歸樹遍歷方法。 – dishan

相關問題