2012-11-07 12 views
8

私はJavaのリンクリストクラスを使用しないプログラムで作業しています。私は一からそれを構築しています。私はリンクされたリストの特定の位置にノードを挿入するメソッドを書くこと以外はすべて成功しています。リンクリストの途中にノードを挿入して誤ってヌルノードも挿入します

特定のノードを「現在の」ノードとして設定するメソッドがあります。ですから、例えば、私はこのようになり、リンクされたリストを持っている: - > - >良い - - >ペット、そして「現在」に等しい>が作ります2;これは、「現在の」ノードが「犬」であることを意味します。

ここからは、情報フィールドがの "current"の位置に新しいNodeを挿入したいとしましょう。正しく行わ場合は、最後のリンクリストは次のようになります。 - > - >良い - - >作る ->は犬>ペット。 "そして"位置2の "犬"を置き換えます。

私の方法は2番目の位置に新しいノードを挿入するように機能しますが、新しく作成されたノードを既存のノードにリンクする際に問題が起こります。新しいノードをリストに挿入するだけでなく、 "dogs"の前に情報のないノードを挿入しています。私のコードは、現在実行されると、出力は次のようになります。 - > - >(空白) - > - >良い - - >ペット>を作ります

私は99.9%の問題がコードの(現在の!= nullの)部分にあると確信していますが、私はそれを修正する方法を理解できません。

私が実際に追加したいノードに加えて空白のノードを挿入している理由は何ですか?

public void insert() { 

    System.out.println("Please enter the text you wish to insert, or type \"end\" if you are done inserting."); 
    String theString; 
    theString = console.nextLine(); 

    while (!theString.equals("end")){ 
     newNode = new Node(); 
     newNode.info = theString; 
     newNode.next = null; 

     if (first == null){ 
      first = newNode; 
      last = newNode; 
     } else if (current != null){ 
      Node p = new Node (current.info, current.next); 
      current.info = newNode.info; 
      current.next = p; 
     } 
     else { 
      last.next = newNode; 
      last = newNode; 
     } 

     System.out.println("Please enter the text you wish to insert, or type \"end\" if you are done inserting."); 
     theString = console.nextLine(); 
    } 
} 

EDIT

プログラム全体は非常に長いが、ここでユーザーは自分にノードを挿入することを望むどの位置に等しい電流設定「setLine」方法です。これは、ユーザプロンプトを介して取得されるパラメータ "int line"をとる。

public Node setLine(int line) { 

    int index = 0; 
    current = first; 
    while (index < line) { 
     previous = current; 
     current = current.next; 
     index++; 
    } 
    return current; 
} 
+0

このタイプのものは、一般的にはSystem.out.println呼び出しが多数あり、ステップバイステップで作業する必要があります。これは実際にはかなり一般的な問題ですが、あなた自身を理解する必要があります。 –

+1

2番目の新しいノードを作成する場合は疑わしいことに注意してください。 –

+0

'コンソール'、 'java.util.Scanner'とは何ですか? –

答えて

0

ノードを正しく挿入するコードは次のとおりです。これは良い出発点です、幸運です(あなたはここで読むことができます:http://www.algolist.net/Data_structures/Singly-linked_list/Insertion)。

public class SinglyLinkedList { 

     public void addLast(SinglyLinkedListNode newNode) {  
      if (newNode == null)  
        return;  
      else {  
        newNode.next = null;  
        if (head == null) {  
         head = newNode;  
         tail = newNode;  
        } else {  
         tail.next = newNode;  
         tail = newNode;  
        }  
      }  
     } 

     public void addFirst(SinglyLinkedListNode newNode) {  
      if (newNode == null)  
        return;  
      else {  
        if (head == null) {  
         newNode.next = null;  
         head = newNode;  
         tail = newNode;  
        } else {  
         newNode.next = head;  
         head = newNode;  
        }  
      }  
     } 

     public void insertAfter(SinglyLinkedListNode previous,  
        SinglyLinkedListNode newNode) {  
      if (newNode == null)  
        return;  
      else {  
        if (previous == null)  
         addFirst(newNode);  
        else if (previous == tail) 
         addLast(newNode);  
        else {  
         SinglyLinkedListNode next = previous.next;  
         previous.next = newNode;  
         newNode.next = next;  
        }  
      }  
     }  
} 
+0

'newNode'はなぜnullになるのですか?なぜあなたはそれを無視するのではなく、NPEを投げないのですか? – EJP

-1

インデックスに基づいて、ノードを中央に挿入する以下の方法を参照できます。

public boolean insertInMiddle(int index, int data){ 

    boolean isInserted = false; 

    Node node = new Node(data); 
    Node temp = head; 
    int i=0; 
    if(index >= 0 && index <= size()){ 
     isInserted = true; 
     if(index == 0){ 
      if(head !=null){ 
       node.nextNode = head; 
       head.prevNode = node; 
       head = node; 
      }else{ 
       head = node; 
       tail=node; 
      } 
     }else{ 
      while(i<index){ 
       temp = temp.nextNode; 
       i++; 
      }    
      if(temp == null){ 
       node.nextNode = temp; 
       node.prevNode = tail; 
       node.prevNode.nextNode = node; 
       tail=node; 
      }else{ 
       node.nextNode = temp; 
       node.prevNode = temp.prevNode; 
       temp.prevNode = node; 
       node.prevNode.nextNode = node; 
      } 
     } 
    }  
    return isInserted; 
} 

//Method to get the size 
public int size(){ 
    int size = 0; 

    Node node = head; 
    if(node !=null){ 
     while (node !=null){ 
      size++; 
      node = node.nextNode; 
     } 
    } 

    return size; 
} 
+0

質問された内容ではありません。 – EJP

関連する問題