2013-02-27 13 views
2

我正在通過LinkedLists上的大學實踐。 我很難理解迭代器遍歷LinkedList的add()方法。我們的講師給了我們實現這個代碼,所以從他身上究竟複製:關於LinkedList中ListIterator的add()方法的困惑

public class LinkedList 
{ 
    public LinkedList() { 
     Node first = null; 
    } 

    class Node { 
     public Object data; 
     public Node next; 
    } 

    class LinkedListIterator implements ListIterator { 

     public LinkedListIterator() { 
      Node position = null; 
      Node previous = null; 
     } 

     public void add (Object element) { 
      if (position == null) { 
       addFirst(element); 
       current = first; 
      } else { 
       //1 Node newNode = new Node(); 
       //2 newNode.data = element; 
       //3 newNode.next = current.next; 
       //4 current.next = newNode; 
       //5 current = newNode; 
      } 
      previous = current 
     } 

注:我故意不封裝的變量,並切出多餘的代碼,以節省空間。我知道它不能編譯,但我的問題更具概念性。

添加方法:
if語句只是檢測是否迭代器的位置是否無效,在這種情況下,添加元素LinkedList的開始,並將迭代器位置,這個新創建的節點。

else語句令我困惑:
行1 & 2:創建一個新節點並將其數據設置爲元素參數。
第3行next這個新節點的變量被設置爲當前節點的下一個節點,即它被設置爲迭代器指向的節點的位置之後的任何值。
第4行,迭代器爲的節點的「下一個」當前爲,指向的變爲newNode(有效地完成在兩個現有節點之間插入新節點)。
第5行,迭代器的位置設置爲指向newNode。

在else語句之後,Iterator所指向的前一個節點被設置爲當前節點。

這裏存在這個問題 - 這樣做有效地同步了迭代器的位置和以前的位置。我通過Eclipse調試器進行了檢查。這使得以前無用。但是,我知道你無法反向使用標準迭代器遍歷LinkedList。

當我評論這條線時,似乎沒有任何改變。這一行簡直是不必要的,還是它有一些我實際上沒有意識到的功能? (我要求的另一個原因是因爲在我們的remove()方法的註釋中出現了相反的情況,這似乎沒有用處。

編輯:看起來這個答案可能會回答爲我的當然開發。現在,我先前=當前行移動到電流= newNode線之上。這似乎保持所有值中分離出來。

+0

@Aubin它實際上是一個['ListIterator'](http://docs.oracle.com/javase/7/docs/api/java/util/ListIterator.html),它擴展了常規的'Iterator'接口幷包含'add','set','hasPrevious'和'previous'方法。 – matts 2013-02-27 18:04:37

+0

啊,道歉 - 應該更具體一些。 – 2013-02-27 20:18:36

回答

1

ListIterator.add(Object)合同指定next的後續調用將是不受影響,並且隨後調用previous將返回新元素,即在工具中更新previous的目的add

+0

但是這樣做可以將先前的和當前的同步在一起,這意味着對於程序的其餘運行,它們被設置爲相同的東西。我認爲,正如其他人在這裏所說的那樣,它可能會在後面的講座中得到擴展。 – 2013-02-27 20:17:24

1

您的教授可能會給您示例代碼,這些代碼將在課程後期進行擴展。看起來示例代碼包含將來支持雙向鏈表的部分。雙鏈表允許反向遍歷列表。 See wikipedia for details.

在一個完全不相關的話題上;我讚賞你實際上試圖理解和理解給你的東西,而不是隻是插件和工作來完成任務。這種習慣將在未來爲您服務!

+0

感謝您的支持,它可能會在稍後擴展。並感謝你的客氣話!我們實際上並不需要觸摸或修改添加方法,我只是想知道一切是如何工作的,以及何時最好使用陣列列表,鏈表等。 – 2013-02-27 20:18:20

0

這看起來像是一個bug。 previous = current分配需要在current = newNode分配之前發生。然後previous將引用舊的current,並且新的current將是新創建的節點。

+0

這就是我的想法。我想我們稍後會進一步擴展。謝謝你 – 2013-02-27 20:16:27