Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/solr/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 链表之谜_Java_Linked List - Fatal编程技术网

Java 链表之谜

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

我正在尝试实现链表。 因此,我有第一个类,叫做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。根据问题中的示例,此代码无法工作。您应该为大小方法提供参数。是的,静态大小方法的用法非常混乱,因此我建议您改为使用成员方法。