2016-04-26 97 views
0

我有我的CS類約循環雙向鏈表的分配。我們給了一個Node類來設置鏈接等。理解雙向鏈表循環鏈表

public class Node { 
private Node previous, next; 
private Object data; 

public Node(Object data) { 
    this.data = data; 
} 

public Node() { 

} 

public Node(Object data, Node previous, Node next) { 
    this.previous = previous; 
    this.next = next; 
    this.data = data; 
} 

public Node getPrevious() { 
    return previous; 
} 

public void setPrevious(Node previous) { 
    this.previous = previous; 
} 

public Node getNext() { 
    return next; 
} 

public void setNext(Node next) { 
    this.next = next; 
} 

public Object getData() { 
    return data; 
} 

public void setData(Object data) { 
    this.data = data; 
} 

}

,我們正與執行的一些方法任務。在列表類中有一個創建的名爲'base'的節點

public class DList { 



private Node base; 

public DList() { 

} 

所有的方法都需要某種形式的遍歷列表。從我理解的設置一個臨時節點等於base.getNext()將給我的列表的第一個節點,並測試如果temp!= base將我的檢查到達列表的末尾,因爲基節點服務作爲其餘節點的錨(如果我的理解是正確的)。

但是,當我嘗試做的代碼位如:

public int size() { 
    int count = 0; 
    if (base.getNext() == base) 
     return count; 
    else { 
     Node temp = base.getNext(); 
     while (temp != base) { 
      temp = temp.getNext(); 
      count++; 
     } 
    } 
    return count; 
} 

我得到在該行一個空指針異常,我說的節點溫度= base.getNext();對於我的生活,我無法理解爲什麼,因爲就像我之前說過的,我認爲base.getNext()將是我列表中的第一個元素。

visualization of CDLL

+0

不需要虛擬基節點。在這種情況下,'base'最初爲空。所以'如果base == null ...' –

+0

那麼,基地沒有下一個。它什麼都沒有!我建議你在Node上添加一個「hasNext」方法,這將使你的即將到來的任務變得更容易。 – Tim

回答

0

沒有必要爲一個啞基節點。在這種情況下,最初基數爲空。 在這種情況下:

public int size() { 
    int count = 0; 
    if (base != null) { 
     Node temp = base; 
     do { 
      temp = temp.getNext(); 
      count++; 
     } while (temp != base); 
    } 
    return count; 
}