リンクリストにループがあるかどうかを検出するには、次のコードを検討してください
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 クラスを内部の詳細 (つまりプライベート) として使用することに注意してください。
私が考えることができるいくつかのオプション(それぞれの欠点とともにリストされています)
Linkedlist.java の静的関数 'hasLoop' ? (これは奇妙です。なぜなら、既存の hasLoop を実行したい場合は、ではなく
instanceそれを呼び出すからです)LinkedList.mergeSort(instance)instance.mergeSort()Linkedlist.javaの非静的関数「hasLoop」?
sort(一部の関数はコレクションに属しているため、これは奇妙です)Linkedlist.java をサブクラス化し、新しい関数「hasLoop」を追加しますか? ( say のような別の関数を追加する必要がある場合
findIntersection、別のサブクラスを作成する必要があるため、これは奇妙です)どういうわけかコレクションを使用し、静的メソッド 'hasLoop(List)' を追加し、追加のインターフェイスを LinkedList.java に追加して、何とか可能にしますか? ( Node は内部実装を持つプライベート クラスであり
ptr.next、コレクションでは実行できないため、醜いでしょう。状態setNext()などを変更するには、いくつかのセッターが必要になります。)