单链表:如何添加头部

时间:2013-02-18 22:28:19

标签: java

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

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

2 个答案:

答案 0 :(得分: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;
    }
}

答案 1 :(得分:0)

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

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

在这里创建一个对象n ,其中头对象的类型为Llist,头对象inturn具有另一个类型为Llist的头对象

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