繁体   English   中英

单链接列表:如何添加标题

[英]Singly Linked Lists: How to add the head

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

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

您的链接列表设置不正确。 链表仅应具有对头节点的引用,而头节点应具有对下一个节点的引用。 它看起来应该更像:

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

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

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

在这里,您创建了一个对象n ,它的头部对象的类型为Llist,而头部对象的另一个对象是Llist类型的对象

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM