2016-11-06 10 views
0

単独リンクリストから最後のノードを削除しようとしています。しかし、私はまだコードでこのエラーを解決することができません。私のdeleteFromEndメソッドは、最後のノードを削除していません。 deleteメソッドを呼び出した後も、削除したいノードが表示されます。残りのリストは削除されますが、最後のノード自体は削除されません。あなたは私に何が欠けているのか、どこにエラーがあるのか​​教えていただけますか?リンクリストの最後のノードを削除できません

のLinkedList:

package lab5; 

public class LinkedList { 

    public static void main(String argsp[]) { 
     List ob = new List(); 

     ob.addAtStart("y", 6); 
     ob.addAtStart("w", 4); 
     ob.addAtStart("z", 3); 

     ob.addAtEnd("a", 3); 
     ob.addAtEnd("b", 4); 
     ob.addAtEnd("c", 5); 

     /* 
     * ob.display(); System.out.println("Deleted first one"); 
     * ob.deleteFromStart(); 
     */ 
     ob.display(); 
     System.out.println("Deleted End one"); 
     ob.deleteFromEnd(); 
     ob.display(); 
    } 
} 

一覧:

package lab5; 

public class List { 

    Node head; 

    public List() { 
     head = null; 
    } 

    public List(Node e) { 
     head = e; 
    } 

    Node oldfirst = null; 
    Node lasthead = null; 

    public void addAtStart(String name, int age) { 
     Node newObject = new Node(name, age); 
     newObject.next = head; 

     if (oldfirst == null) { 
      oldfirst = newObject; 
     } 
     head = newObject; 
     lasthead = head; 

    } 

    public void display() { 
     Node store = head; 
     while (store != null) { 
      store.display(); 
      store = store.next; 
      System.out.println(); 
     } 
    } 

    public void addAtEnd(String name, int age) { 
     Node atEndValue = new Node(name, age); 
     oldfirst.next = atEndValue; 
     oldfirst = atEndValue; 
    } 

    public void deleteFromStart() { 
     if (head.next != null) { 
      head = head.next; 
     } 
    } 

    public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 
     while (head != null) { 
      prev = head; 
      head = head.next; 
     } 
     prev.next = null; 
     head = prev; 
    } 

    public Node search(String name) { 
     return head; 
    } 

    public boolean isEmpty() { 
     return head == null; 
    } 

    public int size() { 
     return (head.toString()).length(); 
    } 
} 

ノード:

package lab5; 

public class Node { 

    String name; 
    int age; 
    Node next; 

    public Node() { 
     name = "Abc"; 
     age = 10; 
     next = null; 
    } 

    public Node(String name, int age) { 
     this.name = name; 
     this.age = age; 
     next = null; 
    } 

    public void display() { 
     System.out.println("Name: " + name + " Age: " + age); 
    } 
} 
+0

@nbrooksを今私は新しい質問を。 – Shahzad

+0

'head = head.next;'のポイントは何ですか? – shmosel

+0

ローカル変数 'start'を使う代わりに、' head'を使って移動しています。 – shmosel

答えて

1

。方法は私のために働いた。

public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 

     if(start == null || start.next == null) 
     { 
      head = null; 
      return; 
     } 
     while (start.next != null) { 
      prev = start; 
      start = start.next; 
     } 
     prev.next = null; 
    } 

もう少しあなたのコードを分析した後、私は他のいくつかの問題を発見しました。 addAtStartaddAtEndメソッドを更新する必要があります。

Node lasthead = null; 

public void addAtStart(String name, int age) { 
    Node newObject = new Node(name, age); 
    newObject.next = head; 
    if(head == null) 
     lasthead = newObject; 
    else if(head.next == null) 
     lasthead = head; 

    head = newObject; 

} 


public void addAtEnd(String name, int age) { 
    Node atEndValue = new Node(name, age); 
    lasthead.next = atEndValue; 
    lasthead = atEndValue; 
} 

なぜなら、リストの最後から1つのノードを削除するとします。リストの最後に要素を追加することはできません。

+0

ありがとうございます!うわー!ありがとう。私のコードをレビューしたいと思いませんか1つのコメントでどれくらい良いことと悪いことが分かっていますか? – Shahzad

+0

@BadarShahzadKhanあなたは新しい質問としてここに投稿できますhttp://codereview.stackexchange。com/ – iNan

+1

@iNan注:このコードにはいくつかのコーナーケースに問題があります。つまり、リストなどに要素が1つしかありません。 – simon

0

は、リンクされたLの頭を変更しないでくださいist、そうでなければあなたはリストを失います。 あなたの関数の修正以下試してください:あなたは間違っている、リストの先頭ポインタを変更している

public void deleteFromEnd() { 
     Node start = head; 
     Node prev = null; 
     if(start == null){ 
      return; 
     } 
     if (start.next == null){ 
      head = null; 
      return; 
     } 
     while (start.next != null) { 
      prev = start; 
      start = start.next; 
     } 
     prev.next = null; 
    } 
1

あなたは物事を行う必要があり、片方向リンクリストの末尾から削除している:リストトラバース

  1. 、および最後から2番目のを参照する変数を作成しますあなたのリストの要素。あなたのリンクリストを横断しながら、それが効果的にリスト全体を削除しますので、あなたは、headの値を変更しないでください

NULLに最後から2番目のノードの後に​​ノードを設定し

  • 。あなたはhead変数を上書きしているので、最初に戻る道を見つける方法がありません。代わりに、headとして初期化される一時変数を使用して繰り返します。

    最後に、リストは1つのだけの要素を持っている、または既に空であるエッジケースを検討することを忘れないでください:

    public void deleteFromEnd() { 
        Node current = head; 
        Node previous = null; 
    
        while (current != null && current.next != null) { 
         previous = current; 
         current = current.next; 
        } 
    
        if (current == head) { 
         head = null; 
        } 
    
        if (previous != null) { 
         previous.next = null; 
        } 
    } 
    
  • +0

    ありがとうございます@nbrooks – Shahzad

    関連する問題