2012-04-17 3 views
0

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

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++; 


     } 
+0

このようなデータ構造とメソッドの構築に関して私が今までに得た最良のアドバイスは、コードを書く前に紙に書いておくことでした。それを描くことはあなたが間違っていたところでは非常に明白になります(しかしMatthew Flaschenはあなたのコードで最大の問題点を指摘します)。 –

+1

この宿題はありますか?もしそうなら、そのようにタグを付けてください。 – DNA

答えて

4

リトルはNitemを変更する以外、外の効果があります。恐らく、firstを変更する必要があります。あなたのクラスのフィールドとその意味を文脈に提供すれば助けになります。たとえば、itemが何であるかは不明です。

また、メンバ変数とローカル変数の命名規則を用意するか、一貫してthis.、またはその両方を使用する必要があります。

0

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

+0

それは、論理のより良い理解を得るのを助けたようでした、ありがとう! –

1

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

オブジェクト指向設計を使用します。これは、何かで動作しているのではなく、何かを動作させることを意味します。これが意味することは、ノードがよりインテリジェントでなければならないことです。現在はノード上で動作しています。

ノードは二重化されているので、かなりスマートになります。それは次のようなメソッドを持つことができます:

これを取得したら、残りのコードはちょっと整理する必要があります。これらは、二重にリンクされたリストを実装することは自明でなければなりません。

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について抱いている苦情のほとんどが出てこない。

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++; 
    } 
} 

それはvould automaticaly値を設定shoul Nodeクラスのためのconstuctorを作成するのが賢明、そしてあなただけWITEことができます:

Node newNode = new Node(thing); 
関連する問題