[英]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.