-4

コードを実行するとストックオーバーフローエラーが発生しますが、問題が何であるかわかりません。誰かが私がこれを理解するのを手伝ってもらえますか?

これが私にエラーを与えているメソッドです。ノードの挿入を再帰的に行った方法と関係があると確信していますが、何を間違えたのかわかりません。

このメソッドの目的は、ノードのリンク内の正しい場所を見つけて、そこに新しいアイテムを挿入することです。ノードは昇順の値を維持する必要があります。それが目的をもう少しよく説明するのに役立つことを願っています。ありがとう。

public class OrderedList< T extends Comparable<T> > {

    private ListNode<T> firstNode;
    private ListNode<T> lastNode;
    private String name; // the name is used in printing

    // constructor creates an empty ordered list with "ordered list" as the name
    public OrderedList() {   
        this( "ordered list" );    
    }

    // constructor creates an empty ordered list with a name
    public OrderedList( String listName ) {        
        name = listName;
        firstNode = lastNode = null;    
    }

    // insert an item into the right position of the ordered list
    public void insert( T insertItem ) {       
        if (isEmpty()) {           
            firstNode = lastNode = new ListNode<T>(insertItem);           
        }else {               
            if (insertItem.compareTo(firstNode.getData()) <= 0) {               
                firstNode = new ListNode<T>(insertItem, firstNode);               
            }else {                
                if (firstNode.equals(lastNode)) {                    
                    lastNode = new ListNode<T>(insertItem);                   
                }else {
                    T store = firstNode.getData();
                    firstNode = firstNode.getNext();                   
                    insert(insertItem);                    
                    firstNode.setNext(firstNode);
                    firstNode.setData(store);
                }
            }           
        }
    }

    public boolean isEmpty() {
        return firstNode == null;
    }
}
4

1 に答える 1

1

最後のelseブロックで、insertもう一度呼び出します。したがって、これは再帰関数であり、再帰関数は原則としてスタックオーバーフローに対して脆弱です。

いくつかの println ステートメントと、ステップごとにインクリメントするカウンターを入れると、何が起こっているかを見ることができます。

else {    
            T store = firstNode.getData ();    
            firstNode = firstNode.getNext ();    
            System.out.println ("depth: " + ++depth);
            insert (insertItem);    
            --depth
            firstNode.setNext (firstNode);
            firstNode.setData (store);    
        }

Depth はデバッグ目的の属性または静的変数です。

于 2012-04-27T22:09:46.933 に答える