2012-09-27 116 views
2

我想在類NumLinkedList中實現一個抽象數據類型的NumList作爲單向鏈表。初始化單鏈表Java

public class NumLinkedList implements NumList 
{ 

Node head; 
int nItem; 

private class Node 
{ 
    public Node next; 
    public double value; 
    public Node(double i, Node j) 
    { 
     value = i; 
     next = j; 

    } 

} 

public NumLinkedList() 
{ 
    head = null; 
    nItem = 0; 

} 

是我的初始化,我有以下方法的麻煩。

public void print() 
{ 
    Node currNode = head; 
    while(currNode.next != null) 
    { 
     currNode = currNode.next; 
     System.out.println(currNode.value); 
    } 

} 

public int size() 
{ 
    int size = 0; 
    Node currNode = head; 
    while(currNode.next != null) 
    { 
     currNode = currNode.next; 
     size++; 
     nItem++; 

    } 
    return size; 

} 

public void insert(int i, double value) 
{ 
    if(i < 0) 
    { 
     System.out.println("Error. out of bounds."); 
    } 
    if (i > size()) 
    { 
     Node currNode = head; 
     for(int j = 0; j < i; j++) 
     { 
      currNode = currNode.next; 
     } 
     currNode.next = new Node(value,null); 
    } 

    if (i <= size()) 
    { 
     Node currNode = head; 
     for(int j = 0; j < i-1; j++) // this moves CurrNode to the i-1th node 
     { 
      currNode = currNode.next; 
     } 
     currNode.next = new Node(value,currNode.next); 
    } 

    nItem++; 
} 
運行我的測試代碼

public static void main (String[] args) 
{ 
    NumLinkedList test; 
    test = new NumLinkedList(); 

    //System.out.println("this is how many initial items the initialized list has"); 
    //System.out.println(test.size()); 
    test.insert(1, 0.1); 
    System.out.println("have tried to insert value 0.1 @ position 1, that is the first element in list."); 
    test.print(); 
    System.out.println("tried print(). did it work?"); 
    test.insert(4, -1); 

我得到的

test.insert(1, 0.1); 

錯誤,指的是

if (i > size()) 

while(currNode.next != null) 

由於我初始化我的陣列ADT失敗,我相信我的ADT列表也被錯誤初始化。在Google上很難找到適當的例子,A​​DT初始化的任何參考?

回答

1

你的問題不在初始化中,這很好,但在方法本身。

的問題是,你在你的初始化到headnull,但隨後,無論是在printsize,你做currNode = head,這也使得它null,然後在currNode.next循環。那會在那裏拋出一個NullPointerException。你需要去到所有的方法和極限情況下添加特殊代碼:

對於print

if (head == null) 
    return; 

對於size

if (head == null) 
    return 0; 

或者,你可以簡單地替換整個size方法使用簡單的return nItem;語句。

對於insert

if (head == null) 
{ 
    head = new Node(value,null); 
    return; 
} 

順便說一句,在你insert,你還需要一個return內你的第一個if,你需要用else來代替你的第三個if

+0

等待我不明白爲什麼我需要一個(head == null); 這是初始條件和一個給定的,我不應該只是檢查i值和範圍/限制我的值? – user1702633

+0

如果'head == null'是給定的,你的列表將一直是空的。 'head == null'在初始化之後保持不變,但只有在您沒有將其設置爲正確編碼插入時的某個其他值時才適用。 –