0

単一リンクリストを実装する割り当てがあります。ヘッドを取得する方法を理解しようとしていますが、スタック オーバーフロー エラーまたはヌル ポインター エラーが発生します。誰かが私を助けてくれませんか。関連するコードを表示しました:

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でヘッドをnullに設定する行を削除すると

4

2 に答える 2

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;
    }
}
于 2013-02-19T01:11:09.823 に答える
0

Stackoverflow エラーの理由は、無限再帰で立ち往生していることです

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

ここでは、タイプ Llist のヘッド オブジェクトを持つオブジェクト nを作成します。ヘッド オブジェクトには、タイプ Llist の別のヘッド オブジェクトがあります。

そのため、プログラムはn->head->head->head->...限界に達するまでメモリ空間などを割り当て続けます

于 2013-02-18T23:11:28.560 に答える