1

CS の教授から、循環リンク リストを使用して独自の Java プログラムを開発するように依頼されました。私のプロジェクトは、循環リストから名前 (文字列型) を追加または削除することです。これまでのところ、add メソッドは完全に機能しています。ただし、私の removeNode() メソッドは機能せず、目的の要素を削除しません。また、無限ループに陥り、非常に多くのコードを試しましたが、どちらも機能しません。私の削除方法は次のとおりです。

public E removeNode(E nodeToBeDeleted)
{
    Node<E> nodeFound = findNode(nodeToBeDeleted);

    if(nodeFound != null)
    {
        nodeFound.prev.next = nodeFound.next;
        nodeFound.next.prev = nodeFound.prev;
        size--;
        return nodeFound.data;  
    }
    return null;
}

基本的に、findNode() は、パラメーターとしてプラグインされた String と等しいデータを持つノードを検索しますが、画面上の現在のノードの String 表現を返す outputList() メソッドを呼び出すと、無限ループに陥ります。 .

outputList メソッドは次のとおりです。

public void outputList()
{   
    Node<E> position = head;
    do 
    {
        System.out.print(position.data + " ==> ");
        position = position.next;

    } while((position != null) && (position.next != position));
}

どんな助けでも大歓迎です..事前に感謝します。

Node クラスは次のとおりです。

    static class Node<E> {

    /** The data value. */
    private E data;
    /** The link to the next node. */
    private Node<E> next = null;
    /** The link to the previous node. */
    private Node<E> prev = null;

    private Node(E dataItem) {
        data = dataItem;
    }


    private Node(E newData, Node<E> nodeRef)
    {
        data = newData;
        next = nodeRef;
    }

    private Node(Node<E> prevRef, E newData)
    {
        data = newData;
        prev = prevRef;
    }

   //set next link
    private Node(Node<E> newData, Node<E> nodeRef)
    {
        data = (E) newData;
        next = nodeRef;
    }
} //end class Node
4

2 に答える 2

4
while((position != null) && (position.next != position))

これは実際には次のようになります。

while((position != null) && (position.next != head))

トラバーサルの絶対的な基本ケースであるシングルトンがあると想像してください。 head開始するときも、position先に進みたいときもposition、同じ場所をheadもう一度参照します。これは無限に続きます

再び開始点に到達したら、反復を停止する必要があります。

于 2013-02-18T04:03:12.570 に答える
0
while(position.next != head)

Doublely Circular LinkedList については、上記の条件を確認するだけで十分だと思います。

于 2013-02-18T04:06:44.530 に答える