私はあなたのためにこれの多くをクリアするかもしれない提案をするかもしれません。それはあなたが求めたものではありませんが、あなたが必要としているものかもしれません。
OOデザインを使用します。これは、何かを操作するのではなく、何かを操作するように依頼することを意味します。これが意味するのは、ノードはよりインテリジェントである必要があるということです。現在、ノードを操作しています。
ノードは二重にリンクされているので、かなり賢くなります!次のようなメソッドを使用できます。
newNode.insertBefore(currentNode)
newNode.insertAfter(currentNode)
currentNode.remove()
それらを取得したら、残りのコードを少しクリーンアップする必要があります。二重にリンクされたリストを考えると、実装は簡単なはずです。
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つの可能性は、リストを循環させることです。最初と最後が同じ「特別な」割り当てられていないノードになれない理由はありません。それでも、次のノードをトラバースできます(これにより、最初の実際のアイテムが得られます。リスト内)および前(リスト内の最後のアイテムを提供)。
リスト全体を反復処理するとき、.value == nullの場合、node.next()とprevious()を魅力的に実装しやすくするもう一方の端に到達したことがわかります(実際に実装する必要はありません。次ですが、以下を参照してください。
/** returns null if there are no more items in the list */
Node next() {
return next;
}
それを試してみてください、それはあなたのコードをたくさん単純化します。ほとんどの人は、実際のOOコードがどれほど有用であるかを実際には理解していません。
また、すべての変数をプライベートにします。これは、始めるのに良い習慣です。この場合、ノードが相互に動作しているときでも、ノードは相互のプライベートメンバーにアクセスできるため(思ったほどダーティではありません)、私が書いたようにinsertBeforeを使用でき、ゲッターとセッターまたはパブリック変数。両方の長所。
また、ノードで「動作」していた元のクラスがほとんど消えてしまうことにも注意してください。実際、完全になくなる可能性があります。find(item)やinsertSorted(item)のような特定のメソッドが必要な場合、それらをノード自体に追加できなかった理由はありません。ただし、これは、実装するまでわかりにくい場合があります。
おかしなことに、実際にうまくコーディングすれば、Javaに関する人々の不満のほとんどは出てこないのです。