Java 单链表:如何添加头

Java 单链表:如何添加头,java,Java,我的任务是实现一个单链表。我试图找出如何获取头部,但最终得到堆栈溢出错误或空指针错误。谁能帮帮我吗。我已经显示了相关的代码片段: public class Llist { private Object data; private Llist next; private Llist head = new Llist(null, null); public Llist(Object d) { this(d, null); } pu

我的任务是实现一个单链表。我试图找出如何获取头部,但最终得到堆栈溢出错误或空指针错误。谁能帮帮我吗。我已经显示了相关的代码片段:

public class Llist {

    private Object data;
    private Llist next;
    private Llist head = new Llist(null, null);

    public Llist(Object d) {
        this(d, null);
    }

    public Llist(Object d, Llist n) {
        data = d;
        next = n;
    }
我有一个添加节点的方法,它会检查是否有头,如果没有,那么新节点就是头:

public static Llist add(Llist l, Object d) {
    Llist n = new Llist(d,l);
    if(l.head == null) {
        l.head = n;
    }
    return n;
}

当前我得到一个堆栈溢出错误。。。但是,如果我删除了在2中将head设置为null的行,那么Stackoverflow错误的原因是您陷入了无限递归

public static Llist add(Llist l, Object d) {
    Llist n = new Llist(d,l);
在这里,您创建了一个对象n,该对象具有类型为Llist的头部对象,头部对象inturn具有另一个类型为Llist的头部对象


因此,程序会继续分配内存空间
n->head->head->head->head->……
等等,直到它达到极限为止

您的链表根本没有正确设置。链表应仅包含对头部节点的引用,而头部节点应包含对下一个节点的引用。它应该看起来更像:

public class Llist {

    private Object data;
    private Llist next;

    public Llist(Object d) {
        this(d, null);
    }

    public Llist(Object d, Llist n) {
        data = d;
        next = n;
    }
在这种情况下,您应该始终保留head节点的副本,否则您将丢失整个列表,因为在此实现中,您的列表和节点的类型相同

更好的实现应该有一个单独的节点类。比如:

public class Llist {
    private Node head;

    public Llist(Object o) {
        head = new Node(o);
    }

    public void add(Object o){
        curr = head;
        while(curr != null){
             curr = curr.next;
        }
        curr.next = new Node(o)
    }

public class Node{
    Object data;
    Node next;

    public Node(Object o){
        data = o;
        next = null;
    }
}

您如何调用
add
?最好从您最喜欢的一本或另一本书中获取算法和数据结构。顺便说一句,你的
add
方法不应该是
静态的
。我在一个新的Llist上调用add-in主方法;l、 加(l,6);}
Llist l=null
表示您还没有
Llist
,调用
l.add()
将不起作用。因此,要停止此递归,意味着我必须删除字段头?但是如果我这样做,我怎么能分配一个头部呢?等等。我不是把head对象设为null吗?递归怎么可能?@miniJavaLearner:不是,你只是把next和data的值设为null。但是,您仍然在创建head对象。而且,不需要在类中保留head对象。只需保留一个名为headYes的Llist引用,我知道这是一个更好的实现,但讲师说您不能更改给定的代码。。。