2014-03-26 39 views
0

我想實現鏈接列表。 因此,我有這個一流的,所謂的名單,它代表一個元素鏈接列表神祕

package list; 

/** 
* Linked list with int values. 
* 
* The empty list is represented by a null reference. 
*/ 
public class List { 
    public int value; 
    public List next; 

    /** 
    * Creates a new list 
    * 
    * @param value value of the head of the list 
    * @param next reference to rest of the list; may be null 
    */ 
    public List(int value, List next) 
    { 
     this.value = value; 
     this.next = next; 
    } 
} 

,幷包含以下方法

public static int size(List list) 
    { 
     if(list==null) return 0; 
     else return size(list.next)+1; 
    } 

到目前爲止一切正常鏈表類本身。但是,如果我嘗試

public static int size(List list) 
    { 
     if(list.next==null) return 1; 
     else return size(list.next)+1; 
    } 

我得到一個NullPointerException ...... 我不知道爲什麼這不應該因爲list.next工作應該在一個點是空指針引用,並結束遞歸。 因此不應調用size(null.next)。

我的英語不好道歉,我的任何幫助

+0

您將'list.next'傳遞給'size(..)',但size(..)'檢查list.next'。 'list'的可能值是什麼? –

+0

我真的不知道評論的問題,但列表的值是null(List list = null)或這個(列表本身) – user2351468

+0

所以如果'list == null'如何'list.next'表現? –

回答

0

您的原始size方法處理null論證正確。
第二個版本沒有。
如果您致電List.size(null),對於所有非空輸入,第二個版本只會給出NPE,它應該表現得完全相似。

因此,只需將if (list == null) return 0;添加到您的第二個版本。

我真的建議你聲明size()一個爲成員方法:

public int size() { 
    return next == null ? 1 : next.size() + 1; 
} 

這樣你就可以撥打電話:new List(1, null).size();

+0

我知道,但我不知道錯誤在哪裏:) – user2351468

+0

那麼,通常你不應該得到這個,你可以給你的'NPE'測試輸入嗎? – kiruwka

+0

哦就是這樣!實際上可以檢查未初始化列表的大小,因此可以調用null.next。 – user2351468

0

那是因爲你叫List.size(null)感激。在第一個版本中,你拒絕list==null,在第二個版本中,你沒有。

+0

假設我有三個元素2-> 1-> null。在1下1.next應該給空指針,因此不應該調用list.size(null)? – user2351468

+0

你在自己的答案中給出了例子。注意大寫「L」表示靜態方法的調用。 – Axel

0

答案是由以前的評論的啓發。

它實際上是有可能做到這一點

List list = null; 
LinkedList.size(list); 

,因此,如果該列表未初始化null.next可以被調用。換句話說:我的列表必須至少包含兩個元素(第一個元素和第二個元素)!

+0

根據問題中的示例,此代碼不起作用。你應該爲你的'size'方法提供參數。是的,它的靜態尺寸方法的使用非常混亂,所以我建議你改用它的成員方法。 – kiruwka