リンクリストにループがあるかどうかを検出するには、次のコードを検討してください
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()
などを変更するには、いくつかのセッターが必要になります。)