-1

リンクリストにループがあるかどうかを検出するには、次のコードを検討してください

 public boolean hasLoop() {

    Node<E> fast = first;
    Node<E> slow = first;

    while (fast != null && fast.next != null) {

        fast = fast.next.next;

        slow = slow.next;

        if (slow == fast) {

            return true;

        }

    }

    return false;

}

Sun Microsystemsに機能 (detectLoop, reverseLinkedlist, findIf2linkedlist intersectなど)を追加するとしたらLinkedlist.java、どのようにしますか? Sun は Node クラスを内部の詳細 (つまりプライベート) として使用することに注意してください。

私が考えることができるいくつかのオプション(それぞれの欠点とともにリストされています)

  1. Linkedlist.java の静的関数 'hasLoop' ? (これは奇妙です。なぜなら、既存の hasLoop を実行したい場合は、ではなくinstanceそれを呼び出すからです)LinkedList.mergeSort(instance)instance.mergeSort()

  2. Linkedlist.javaの非静的関数「hasLoop」? sort(一部の関数はコレクションに属しているため、これは奇妙です)

  3. Linkedlist.java をサブクラス化し、新しい関数「hasLoop」を追加しますか? ( say のような別の関数を追加する必要がある場合findIntersection、別のサブクラスを作成する必要があるため、これは奇妙です)

  4. どういうわけかコレクションを使用し、静的メソッド 'hasLoop(List)' を追加し、追加のインターフェイスを LinkedList.java に追加して、何とか可能にしますか? ( Node は内部実装を持つプライベート クラスでありptr.next、コレクションでは実行できないため、醜いでしょう。状態setNext()などを変更するには、いくつかのセッターが必要になります。)

4

1 に答える 1

0

ループは、すべてのリストの中でリンクされたリストの場合にのみ意味があります。したがって、そのような機能は に固有のものである必要がありますLinkedList。最も簡単な方法は次のとおりです。

  • インスタンス メソッドを LinkedList 実装に追加します。hasLoop()

また

  • LinkedList を実装するLoopable<E>where

    Loopable<E>{
       boolean hasLoop();
    }
    
于 2013-09-04T03:06:12.197 に答える