簡體   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