链接列表之谜

时间:2014-03-26 17:06:48

标签: java linked-list

我正在尝试实施链接列表。 因此,我有一个名为List的第一个类,它代表一个元素

 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)。

我为糟糕的英语道歉,并感谢任何帮助

3 个答案:

答案 0 :(得分:0)

这是因为你致电List.size(null)。在第一个版本中,您检查list==null,在第二个版本中,您不会#39; t。

答案 1 :(得分:0)

您的原始size方法处理null参数很好。
第二个版本没有。
如果你致电NPE,第二个版本只会给List.size(null),对于所有非空输入,它应该表现得非常相似。

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

我真的建议您将size() a声明为成员方法:

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

所以你可以打电话:new List(1, null).size();

答案 2 :(得分:0)

答案的灵感来自之前的评论。

实际上可以这样做

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

因此,如果列表未初始化,则可以调用null.next。 换句话说:我的列表必须至少有两个元素(第一个元素和空格)!