Java 链表之谜
我正在尝试实现链表。 因此,我有第一个类,叫做List,它代表一个元素Java 链表之谜,java,linked-list,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
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应该是一个指向空指针的引用,并结束递归。
因此,永远不应调用sizenull.next
我为糟糕的英语道歉,并感谢您的帮助,因为您拨打了List.sizenull。在第一个版本中,您选择list==null,而在第二个版本中,您不选择。原始的size方法可以很好地处理null参数。
第二个版本没有。
第二个版本只有在调用List.sizenull时才会提供NPE,对于所有非空输入,它的行为应该完全相似
因此,只需添加if list==null返回0;到你的第二个版本
我真的建议您将大小声明为成员方法:
public int size() {
return next == null ? 1 : next.size() + 1;
}
因此您可以调用:newlist1,null.size 这个答案是受先前评论的启发得出的 这实际上是可能的
List list = null;
LinkedList.size(list);
因此,如果列表未初始化,则可以调用null.next。
换句话说:我的列表必须至少有两个元素firstelement和null 您通过了列表。在大小旁边。。但是尺寸。。检查列表。下一步。list的可能值是什么?我并不真正理解注释的问题,但是list的值要么是null list list=null,要么就是列表本身。如果list==null,list.next的行为如何?这将是个例外。但是它不应该走那么远,但是它不应该走那么远——为什么不呢?这是您的方法所做的第一件事:iflist.next==null return 1;。正如注释所说——空列表由null引用表示——那么您的方法如何处理空列表呢?假设我有三个元素2->1->null。在1处,1.next应该给出空指针,因此永远不应该调用list.sizenull?您在自己的答案中给出了示例。注意大写字母L表示静态方法的调用。我知道,但我不知道错误在哪里:嗯,通常你不应该得到这个,你能为你的NPE提供测试输入吗?哦,就是这样!实际上可以检查未初始化列表的大小,因此可以调用null.next。根据问题中的示例,此代码无法工作。您应该为大小方法提供参数。是的,静态大小方法的用法非常混乱,因此我建议您改为使用成员方法。