0

独自の Deque クラスを作成する必要があり、二重リンク リストの実装を使用してデータを格納する必要があります。問題は、両端キューの左側に挿入されるメソッド pushfromLeft(Thing thing) を作成することです。以下は私がこれまで持っているものですが、うまくいかないようです。

 public void pushLeft(Thing thing) {
         Node beg = new Node();  
         Node end = new Node();
         Node T = new Node();  

       if(isEmpty())
       { 
             beg = first;
             end = last;
             beg = end;
             T = beg.thing;
             N++;
       }
       else
       {
             beg = beg.next;
             end = end.next;
             T = beg.previous;
             N++;


       }
4

4 に答える 4

4

Nそのメソッドで行うことは、とを変更することを除いて、外部に影響を与えることはほとんどありませんitem。おそらく、変更する必要がありますfirst。クラスのフィールドとその意味をコンテキストとして提供すると役立ちます。たとえば、何が何でitemあるかは明確ではありません。

また、メンバー変数とローカル変数に名前を付けるためのさまざまな規則を考え出すか、一貫して を使用するthis.か、またはその両方を行う必要があります。

于 2012-04-17T18:34:53.117 に答える
1

私はあなたのためにこれの多くをクリアするかもしれない提案をするかもしれません。それはあなたが求めたものではありませんが、あなたが必要としているものかもしれません。

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に関する人々の不満のほとんどは出てこないのです。

于 2012-04-17T18:53:01.297 に答える
0

Node追加メソッド内で複数作成する必要はありません。左から、そして後で右から読みたい場合は、それぞれNodeが前の要素と次の要素を覚えている必要があります。次に、追加するときに、次のようにこれらのリンクを再配置する必要があります。

public void pushLeft(Thing thing) {
   Node newNode = new Node();  
   newNode.setValue(thing); //or just   newNode.value = thing;

   if(this.isEmpty())
   { 
         this.first = this.last = newNode;
         this.n=1;
   }
   else
   {
         this.first.previous = newNode;
         newNode.next = this.first;
         this.first = newNode;
         this.n++;
   }
}

自動的に値を設定する Node クラスのコンストラクターを作成するのが賢明です。

Node newNode = new Node(thing);
于 2012-04-17T19:01:29.227 に答える
0

LinkedList のソース コードを参考にしましたか?

于 2012-04-17T18:39:26.320 に答える