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引用,我知道这是一个更好的实现,但讲师说您不能更改给定的代码。。。