私はあなたのためにこれをたくさんクリアするかもしれない提案をするかもしれません。あなたの求めるものではありませんが、必要なものかもしれません。
オブジェクト指向設計を使用します。これは、何かで動作しているのではなく、何かを動作させることを意味します。これが意味することは、ノードがよりインテリジェントでなければならないことです。現在はノード上で動作しています。
ノードは二重化されているので、かなりスマートになります。それは次のようなメソッドを持つことができます:
これを取得したら、残りのコードはちょっと整理する必要があります。これらは、二重にリンクされたリストを実装することは自明でなければなりません。
void insertBefore(node existing) {
// first set my stuff up
previous = existing.previous;
next = existing;
// then point other stuff at me
previous.next = this;
existing.previous = this;
}
私は思っています - それはちょうど私の頭の上にあります。
もう1つの質問は、どのように "エンドポイント"を処理するかです。最初のポインタと最後のポインタはNodeのインスタンスでなければなりませんが、元のコードの "If"要素全体に注意してください。甘い!
ちょうど常に最初と最後のオブジェクトが互いを指し示す(値をとらない)ようになっています。最初に追加するときは、first.insertAfter()またはlast.insertBefore()を実行します。
もう1つの可能性は、リストを循環させることです - FirstとLastが同じ "特別な"割り当てられていないノードにならない理由はありません。リストの最初の実際のアイテム)とPrevious(あなたのリストの最後のアイテムを与えます)。
.value == nullの場合、node.next()とprevious()を魅力的に簡単に実装できるようにしています(実際には.nextを実装する必要がありますが、下記を参照してください。
/** returns null if there are no more items in the list */
Node next() {
return next;
}
それはあなたのコードLOTを簡素化し、それを試してみてください。ほとんどの人は本当に実際のOOコードがどのように便利得ることはありません。
また、すべて作りますあなたの変数はプライベートなので、入り込むのはいい習慣です。この場合、ノードをお互いに操作していると、互いにプライベートなメンバーにアクセスすることができます。あなたはまだ私がそれを書いたようにinsertBeforeを持つことができ、gettersとsetterまたはpublic変数を持つ必要はありません。両方の長所。
ノード上で「操作済み」のクラスがどのように消滅しているのか、実際には完全に消えることがあります。 find(item)やinsertSorted(item)のような特定のメソッドが必要な場合は、ノード自体に追加できない理由はありません。これはあなたがそれを実装した後まで見るのが難しいかもしれません。
あなたが実際にコードを書くと、人々がJavaについて抱いている苦情のほとんどが出てこない。
このようなデータ構造とメソッドの構築に関して私が今までに得た最良のアドバイスは、コードを書く前に紙に書いておくことでした。それを描くことはあなたが間違っていたところでは非常に明白になります(しかしMatthew Flaschenはあなたのコードで最大の問題点を指摘します)。 –
この宿題はありますか?もしそうなら、そのようにタグを付けてください。 – DNA