0

我有一个任务来实现一个单链表。我试图弄清楚如何获得头部,但我最终得到堆栈溢出错误或空指针错误。有人可以帮助我。我已经显示了相关的代码:

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 的行

4

2 回答 2

1

您的链接列表根本没有正确设置。链表应该只有对头节点的引用,头节点应该持有对下一个节点的引用。它应该看起来更像:

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;
    }

在这种情况下,您应该始终保留头节点的副本,否则您将丢失整个列表,因为您的列表和节点在此实现中是相同的类型。

更好的实现将有一个单独的 Node 类。就像是:

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;
    }
}
于 2013-02-19T01:11:09.823 回答
0

Stackoverflow 错误的原因是你陷入了无限递归

public static Llist add(Llist l, Object d) {
    Llist n = new Llist(d,l);

在这里,您创建一个对象 n,它具有Llist 类型的头对象,头对象又具有另一个 Llist 类型的头对象

因此,程序继续分配内存空间n->head->head->head->...等等,直到达到极限

于 2013-02-18T23:11:28.560 回答