2017-02-20 1 views
0

ノードの特定の位置に文字列を追加しようとします。何らかの理由で、ある位置に新しい文字列を入力しようとすると、すでにリストにあった既存のデータがすべて消去されます。何が間違っているのか分かりません。insertAtPosメソッドDoublyLinkedList

public void insertAt(String data, int pos) 
    { 
     if(head == null) 
      insertAtStart(data); 
     else if(pos < 1 || pos > size) 
      System.out.println("Position Out Of Bounds"); 

     Node current = head; 
     int i = 1; 
     while(i < pos) 
     { 
      current = current.next; 
      i++; 
     } 

     if(current.prev == null) 
     { 
      Node newLink = new Node(data); 
      current.prev = newLink; 
      head = newLink; 
     } 
     else 
     { 
      Node newLink = new Node(data); 
      current.prev.next = newLink; 
      current.prev = newLink; 
     } 
     size++; 
    } 
+0

「pos」を0ではなく、1で始めるのが一般的です。同じことをお勧めします。 –

+0

私のプロジェクトでは、1から始める必要があります。その理由は0で始まっていませんでした。 – bubbles2189

+0

「範囲外」の場合、無効なインデックスに継続して追加するのではなく、戻りたいと考えています。 シングルリターンポイント(優良事例IMO)を気にするなら、 'println'の後の部分を' else'ボディに移動することができます。 –

答えて

0

  1. 現在のノードは、現在検討中リストの最初の要素を、以下の点をされてみてください?
  2. 現在のノードがリストの途中で終了しましたか?
  3. 現在のノードは現在リストの最後の要素ですか?

そして、この場合はそれぞれ、それがケース2の場合はケース1

 if(current == head) // sure its the head but.. 
     { 
      if(head.next != null) // is the list NOT EMPTY? 
      { 
       newLink.next = head; 
       head = newLink; 
      } 
      else // list is empty 
      { 
       head = newLink; 
      } 
     } 

のためのユニークな取り扱い

だたが、現在は中央の

current.prev.next = newLink; 
newLink.prev = current.prev.next; 

newLink.next = current; 
current.prev = newLink; 

//以前のどこかにあります現在のポインタをnewLinkに送信

//二重のリストなので、newLink.prevポインタ現在のノードまでPOINTSを戻す

// newLinkの隣には何がありますか?現在の権利?

//それはケース3のバックnewLink

に二重リスト、current.prevポインタポイントですので、現在は、リストの最後にヌルですが、ループのために現在の前にポインタを保存した場合覚えています、我々はあまりにも

prevToCurrent.next = newLink; 
newLink.prev = prevToCurrent; 

をこの問題を解決する可能性が今、すべての場合

public void insertAt(String data, int pos) 
{ 
    if(head == null) 
    { 
     head = new Node(data); 
    } 
    else 
    { 
     Node newLink = new Node(data); 
     Node current = head , prevToCurrent = null; 
     for(int x = 1; current != null && x < pos; x++) 
     { 
      prevToCurrent = current; 
      current = current.next; 
     } 
     if(current == head) 
     { 
      if(head.next != null) 
      { 
       newLink.next = head; 
       head = newLink; 
      } 
      else 
      { 
       head = newLink; 
      } 
     } 
     else if(current == null) 
     { 
      prevToCurrent.next = newLink; 
      newLink.prev = prevToCurrent; 
     } 
     else 
     { 
      current.prev.next = newLink; 
      newLink.prev = current.prev.next; 

      newLink.next = current; 
      current.prev = newLink; 
     } 
    } 
    size++; 
} 

は、何かがうまくいかない場合は、私がテストし、POSの前にそれをコンパイルしたように私に教えてくださいコンパイルすることができます

0

newLink.prevnewLink.nextを設定していません。この結果、リンクされたリストの途中にリンクが壊れます。 headを上書きする前にヘッドケース(current.prev == null)において

、共通場合

newLink.next = head; 

current.prevを上書きする前に。

newLink.prev = current.prev; 
newLink.next = current; 
+0

このメソッドでリストの最後にデータを挿入しようとすると、頭に何か問題があることを示すnullポインタ例外が表示されますcase(current.prev == null) – bubbles2189

+0

5つの要素のリストがあり、1から始める場合、末尾に追加するには6を追加する必要があります。つまり、 'while'ループは最後の要素の' next'を返します。これは 'null'です。それは 'NullPointerException'を投げているはずです。 'pos ==(size + 1)'に特殊なケースを追加することをお勧めします。これはまた、 "範囲外"条件を変更する必要があることを意味します。 –

+0

範囲外の条件では、サイズ+ 1(pos> size + 1)を追加するだけです。 pos ==(size + 1)の新しいケースを作成し、posが最後にある場合は末尾に挿入します – bubbles2189

関連する問題