我正在尝试实施链接列表。 因此,我有一个名为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)。
我为糟糕的英语道歉,并感谢任何帮助
答案 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
。
换句话说:我的列表必须至少有两个元素(第一个元素和空格)!