2013-06-25 31 views
0

這給我一些麻煩......我不太明白髮生了什麼事。這是一個數據結構分配,我根據教師UML圖創建了每個類。這看起來像是一個奇怪的鏈表實現。我不太瞭解ListNode類中的構造函數調用另一個構造函數,我不明白爲什麼沒有指定計數器來跟蹤列表中的項目。我也不明白我寫的異常類,因爲教師指定「第二個構造函數調用超類的構造函數,併發送以下字符串作爲其參數:(name +」爲空「);」我只是空着。我不太明白這是如何工作的。我也完全不知道泛型如何工作。我做了一些閱讀,但沒有明確說明。我會發布我的代碼和任何幫助,將不勝感激。我花了一天的工作去做這件事,我覺得自己是個絕對白癡,因爲這看起來並不難。鏈接列表與泛型類型的問題

的ListNode類:

package linkedLists; 

public class ListNode<T> { 

T data; 
ListNode<T> nextNode; 

ListNode(T object) 
{ 
    this(object, null); 
} 

ListNode(T object, ListNode<T> node) 
{ 
    data = object; 
    nextNode = node; 
} 

T getData() 
{ 
    return data; 
} 

ListNode<T> getNext() 
{ 
    return nextNode; 
} 
} 

這裏是List類。

package linkedLists; 

    public class List<T>{ 

     ListNode<T> firstNode; 
ListNode<T> lastNode; 
String name; 

public List() 
{ 
    this("list"); 
} 

public List(String listName) 
{ 
    name = listName; 
    firstNode = null; 
    lastNode = null; 
} 

public void insertAtFront(T insertItem) 
{ 
    if(isEmpty()) 
    { 
     ListNode<T> node = new ListNode<T>(insertItem); 
     firstNode = node; 
     lastNode = node; 
    } 

    else 
    { 
     ListNode<T> tempNode = firstNode; 
     ListNode node = new ListNode(insertItem, tempNode); 
     firstNode = node; 
    } 
} 

public void insertAtBack(T insertItem) 
{ 
    if(isEmpty()) 
    { 
     ListNode<T> node = new ListNode<T>(insertItem); 
     firstNode = node; 
     lastNode = node; 
    } 

    else 
    { 
     ListNode<T> tempNode = lastNode; 
     ListNode node = new ListNode(insertItem, tempNode); 
     lastNode = node; 
    } 
} 

public T removeFromFront() throws EmptyListException 
{ 
    if(isEmpty()) 
    { 
     throw new EmptyListException("gfy"); 
    } 

    else 
    { 
     ListNode<T> nr; 
     nr = firstNode; 

     if(firstNode == lastNode) 
     { 
      firstNode = null; 
      lastNode = null; 
     } 

     else 
     { 
      firstNode = firstNode.getNext(); 
     } 

     return nr.getData(); 
    } 
} 

public T removeFromBack() throws EmptyListException 
{ 
    if(isEmpty()) 
    { 
     throw new EmptyListException("gfy"); 
    } 

    else 
    { 
     ListNode<T> nr; 
     nr = lastNode; 

     if(firstNode == lastNode) 
     { 
      firstNode = null; 
      lastNode = null; 
     } 

     else 
     { 
      ListNode<T> current = firstNode; 
      ListNode<T> secondToLast = null; 
      int numOfNodes = 0; 

      while(current != lastNode) 
      { 
       secondToLast = current; 
       current = current.getNext(); 
      } 

      lastNode = secondToLast; 
      lastNode.nextNode = null; 
     } 

     return nr.getData(); 
    } 

} 

    public boolean isEmpty() 
    { 
    if(firstNode == null) 
    return true; 

    else 
     return false; 
} 

public void print() 
{ 
    if(isEmpty()) 
    { 
     System.out.println("List is empty!"); 
     return; 
    } 

    else 
    { 
     System.out.println(firstNode.getData()); 
     ListNode<T> printNode = firstNode; 

     while(printNode != lastNode) 
     { 
      printNode = printNode.getNext(); 
      System.out.println(printNode.getData());     
     } 
    } 

} 



    } 

Exception類

package linkedLists; 

     public class EmptyListException extends RuntimeException 
    { 
    public EmptyListException() 
    { 
     this("list"); 
    } 

    public EmptyListException(String name) 
    { 
    } 
     } 

最後的主要方法和測試類:

// ListTest.java 
// ListTest class to demonstrate List capabilities. 
import quiz1cs304summer2013kensotak.List; 
import quiz1cs304summer2013kensotak.EmptyListException; 

public class ListTest 
{ 
    public static void main(String[] args) 
    { 
     List<Integer> list = new List<Integer>(); // create a List 

     // insert integers in list 
     list.insertAtFront(-1); 
     list.print(); 
     list.insertAtFront(0); 
     list.print(); 
     list.insertAtBack(1); 
     list.print(); 
     list.insertAtBack(5); 
     list.print(); 

     // remove objects from list; print after each removal 
     try 
     { 
     int removedItem = list.removeFromFront(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 

     removedItem = list.removeFromFront(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 

     removedItem = list.removeFromBack(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 

     removedItem = list.removeFromBack(); 
     System.out.printf("\n%d removed\n", removedItem); 
     list.print(); 
     } // end try 
     catch (EmptyListException emptyListException) 
     { 
     emptyListException.printStackTrace(); 
     } // end catch 
    } // end main 
    } // end class ListTest 

下面列出的是輸出:

The list is: -1 
The list is: 0 -1 
The list is: 0 -1 1 
The list is: 0 -1 1 5 

0 removed 
The list is: -1 1 5 

-1 removed 
The list is: 1 5 

5 removed 
The list is: 1 

1 removed 
Empty list 

我的輸出是:

-1 
0 
-1 
0 
-1 
Exception in thread "main" java.lang.NullPointerException 
    at linkedLists.List.print(List.java:146) 
    at ListTest.main(ListTest.java:18) 
+0

調用另一個的構造函數稱爲_constructor chaining_,並已在[此問題](http://stackoverflow.com/q/285177/1281433)中進行了討論。 –

+2

你有很多問題和很多代碼。我的建議是在做一些研究之後問幾個問題(你說你不懂泛型,這是一個很好的開始) – Daniel

回答

0

首先,您的打印方法甚至不會嘗試打印前導文本(「列表爲:」),並且它會在各自的行上打印每個項目。

鑑於這一點,它看起來像是insertAtBack的問題:使新的ListNode返回的參數(新節點應該在最後一個節點temp節點之後出現)。

+0

我明白你在說什麼了。我糾正了它,現在它正常運行。非常感謝你!對我來說非常愚蠢的監督。 – supertommy