2013-03-06 69 views
2

所以我想更好地理解LinkedLists,並且練習告訴我爲我編寫的鏈表類的迭代器類的方法添加remove()。 我的迭代器類看起來是這樣的:LinkedList迭代器類的remove()

public java.util.Iterator<T> iterator() { 
    return new java.util.Iterator<T>() { 
     Node prev= null,curr = head; 

     public boolean hasNext() { 
      if (curr != null) { 
       return true; 
      } 
      return false; 
     } 

     public T next() { 
      T temp = curr.data; 
      prev = curr; 
      curr = curr.next; 
      return temp; 
     } 

     public void remove() { 
      if(prev==null || curr==null) 
       head=head.next; 
      else 
       prev.next=curr.next; 
     } 
    }; 
} 

而且,我寫它的測試去有點像這樣:

public void testiterator(){ 
    BasicLinkedList<String> basicList = new BasicLinkedList<String>(); 
    basicList.addToFront("Blue").addToEnd("Red").addToFront("Yellow"); 
    for(Iterator<String> i = basicList.iterator(); i.hasNext();){ 
     if(i.next().equals("Blue")) 
      i.remove(); 
    } 
    assertTrue(basicList.toString().equals("\" Yellow Red \"")); 
} 

然而,當,當我打印basicList,它告訴我,該列表包含黃色和藍色而不是黃色和紅色。我是否執行了remove()方法錯誤,我是否使用了錯誤,或者兩者都有?

感謝您的時間傢伙!

回答

1

問題是curr不引用返回的最後一個元素,而是引用下一個要返回的元素。

remove()是爲了去除前者,而你的方法去掉後者。

+0

這幾乎是加強我的想法發生了什麼。我通過添加第三個稱爲prevOriginal的節點來修復我的代碼。當next()被稱爲prevOriginal = prev之前,任何事情都被設置爲下一個。然後在刪除我用prevOriginal.next = prev.next正確地移動列表。原油我知道,但我想它的工作原理:\ 謝謝! – CoderNinja 2013-03-06 22:06:00

0

爲什麼不把電流設置到下一個節點。爲什麼要在remove方法中檢查null。

+0

我想這只是我對迭代器如何工作以及如何使用remove方法缺乏理解的結果。我想我忘記了當.next()被調用時,它轉移到下一個,並且刪除沒有辦法記住原始節點是什麼。 – CoderNinja 2013-03-06 22:02:26

0

試試這個隊友:

public java.util.Iterator<T> iterator() { 
    return new java.util.Iterator<T>() { 
     Node<T> prev = null; 
     Node<T> curr = null; 

     public boolean hasNext() { 
      if (curr == null) { 
       return (head != null); 
      } 
      return (curr.next != null); 
     } 

     public T next() { 
      if (!hasNext()) { 
       return null; 
      } 
      if (curr == null) { 
       curr = head; 
      } else { 
       prev = curr; 
       curr = curr.next; 
      } 
      return curr.data; 
     } 

     public void remove() { 
      if (curr != null) { 
       if (prev != null) { 
        prev.next = curr.next; 
       } else { 
        head = curr.next; 
       } 
      } 
     } 
    }; 
} 
+0

嘗試這一點,它沒有正確迭代。有一個只是「黃色」的列表,併爲(String element:basicList)運行了一個 'System.out.print(element +「」); } ' – CoderNinja 2013-03-06 21:59:19

+0

您可以發佈您的代碼爲這3種方法:'BasicLinkedList'(構造函數),'addToFront'和'addToEnd'? – vikingsteve 2013-03-07 07:45:21