【问题标题】:Singly Linked Lists: How to add the head单链表:如何添加头部
【发布时间】:2013-02-18 22:28:19
【问题描述】:

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

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

【问题讨论】:

  • 你怎么打电话给add
  • 最好从this list 或其他您最喜欢的风格和实践中获取算法和数据结构书籍。顺便说一句,你的add 方法不应该是static
  • 我在我创建的新 Llist 上调用 main 方法中的 add。
  • 像这样:Llist l = null; l.add(l, 6); }
  • Llist l = null 表示您还没有Llist,调用l.add() 将不起作用。

标签: java


【解决方案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;
    }
}

【讨论】:

  • 是的,我知道这是一个更好的实现,但是讲师说你不能更改给定的代码......
【解决方案2】:

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

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

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

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

【讨论】:

  • 所以要停止这种递归是否意味着我必须删除字段头?但是,如果我这样做,我将如何分配头部?
  • 等等。我不是让head对象为null吗,递归怎么可能?
  • @miniJavaLearner :不,您不是刚刚将 next 和 data 的值分配为空。但是,您仍在创建头对象。此外,无需在类中保留头对象。只需保留一个名为 head 的 Llist 的引用
猜你喜欢
  • 2020-06-23
  • 1970-01-01
  • 1970-01-01
  • 2014-06-10
  • 2012-09-22
  • 2021-11-30
  • 2019-10-30
  • 1970-01-01
  • 2019-05-06
相关资源
最近更新 更多