2

C# を使用した循環リンク リストの非常に単純な実装の例はありますか?

私はこのリンクされたリストを持っていますが、それを循環させる方法がわかりません:

    public class LinkedList
    {
        public class Node
        {
            public Node next;
            public Object data;
        }

        private Node head;

        public void Add(Object data)
        {
            Node toAdd = new Node();
            toAdd.data = data;
            Node current = head;                
            current.next = toAdd;
        }

    }

ありがとう。

4

1 に答える 1

6

リンク リストを循環させるには、テール ノードがヘッド ノードを参照する必要があります。Add()したがって、メソッドの最後でこれを行うだけです。

toAdd.next = head;

Add()メソッドは、リンクされたリスト内のすべてのノードを反復するのではなく、単純に反復することに注意してください。

Node current = head;

したがって、複数のノードを追加しようとすると、ヘッド ノードのみが更新されて新しい各ノードを指すようになり、各Add()呼び出しでの参照が置き換えられ、リンク リストには常に最大 2 つのノードしか含まれません。

次のようにすべてのノードを反復処理できます (これにより、上記の行が置き換えられます)。

Node current = head;

while (current.next != head)
{
    current = current.next;
}

currentリンクされたリストに追加するノードの数に関係なく、テールノードを表すようになりました。次に、新しいテール ノードを追加し、古いノードを新しいノードに向け、新しいノードをヘッド ノードに戻すことができます。

もう 1 つ: の現在の実装でAdd()は、リンク リストをヘッド ノードで初期化する必要があります。そうしないNullReferenceExceptionと、何かを追加しようとすると a が発生します。この問題を簡単に処理するコンストラクタを作成できます。

于 2011-04-01T20:22:04.387 に答える