2016-10-13 3 views
0

私はノードと単一のリンクリストを試しています。テールリストを削除して印刷したいと思います。私のメインでは私はそれをしようとしたが、それは私にエラーを与える。テールリストを削除してリストを印刷するにはどうすればいいですか?

EDIT:エラー行をコメント付き 出力:

Circle{radius=2} has a perimeter: 12.56 
Circle{radius=1} has a perimeter: 6.28 
Square{length=3} has perimeter: 12.0 
Square{length=5} has perimeter: 20.0 
Triangle{length=1 width=4 height=5} has perimeter: 10.0 
Triangle{length=3 width=5 height=7} has perimeter: 15.0 
Rectangle{length=1 width=2} has perimeter: 6.0 
Rectangle{length=8 width=9} has perimeter: 34.0 

私は行のコメントを解除した場合、私は日食でこのエラーが発生します。

Exception in thread "main" java.lang.NullPointerException 
    at ShapeLinkedList.deleteAtIndex(ShapeLinkedList.java:108) 
    at M.main(M.java:35) 

メイン:

public class M { 

    public static void main(String[] args) { 
     // TODO Auto-generated method stub 

     int[] values = {2,1,3,5,1,4,5,3,5,7,1,2,8,9}; 
     ShapeLinkedList sll = new ShapeLinkedList(); 
     Circle c1 = new Circle(values[0]); 
     Circle c2 = new Circle(values[1]); 
     Square sq1 = new Square(values[2]); 
     Square sq2 = new Square(values[3]); 
     Triangle t1 = new Triangle(values[4],values[5],values[6]); 
     Triangle t2 = new Triangle(values[7],values[8],values[9]); 
     Rectangle r1 = new Rectangle(values[10],values[11]); 
     Rectangle r2 = new Rectangle(values[12],values[13]); 
     sll.insertAtBeginning(r1); 
     sll.insertAtBeginning(r2); 
     sll.insertAtBeginning(c1); 
     sll.insertAtBeginning(c2); 
     sll.insertAtEnd(sq1); 
     sll.insertAtEnd(sq2); 
     sll.insertAtEnd(t1); 
     sll.insertAtEnd(t2); 

     System.out.println(c1); 
     System.out.println(c2); 
     System.out.println(sq1); 
     System.out.println(sq2); 
     System.out.println(t1); 
     System.out.println(t2); 
     System.out.println(r1); 
     System.out.println(r2); 

     //ERROR STARTS HERE 

     /*sll.deleteAtIndex(sll.length()); 



     System.out.println(c1); 
     System.out.println(c2); 
     System.out.println(sq1); 
     System.out.println(sq2); 
     System.out.println(t1); 
     System.out.println(t2); 
     System.out.println(r1); 
     System.out.println(r2); 

    */ 
    } 

} 

ShapeLinkedList:

public class ShapeLinkedList { 

    public Node head; 

    public ShapeLinkedList() { 
     head = null; 
    } 



    public ShapeLinkedList(Node head) { 
     this.head = head; 
    } 
    public boolean isEmpty() { 
     return length() == 0; 
    } 
    public void insertAtEnd(Shape data) { 
// TODO to be implemented 
     Node n = new Node(data,null); 
     if (head == null) 
      head = n; 
     else 
     { 

      tail().setNext(n); 
     } 

    } 
    public void insertAtBeginning(Shape data) { 
// TODO to be implemented 
     Node n = new Node(data, head); 
     head = n; 
    } 
    public Node tail() { 
// TODO to be implemented 
// returns the last node 
     Node temp = head; 
     if(temp != null) 
     { 
      while(temp.getNext() != null) 
      { 
       temp = temp.getNext(); 
      } 
     } 
     return temp; 
    } 
    public int length() { 
// TODO to be implemented 
     Node temp = head; 

     if(temp == null) 
      return 0; 
     else 
     { 
      int i = 1; 
      while(temp.getNext() != null) 
      { 
       temp = temp.getNext(); 
       i++; 

      } 
      return i; 
     } 
    } 
    void insertAtIndex(int idx, Shape data) { 
// TODO to be implemented 
     if(length() >= idx) 
     { 
      Node n = new Node(data, null); 

      Node temp = findAtIndex(idx); 

      n.setNext(temp.getNext()); 
      temp.setNext(n); 
     } 

    } 
    Node findAtIndex(int idx) { 
// TODO to be implemented 

     if(length() >= idx) 
     { 
      Node temp = head; 
      for(int i = 0; i < idx; i++) 
      { 
       temp = temp.getNext(); 
      } 
      return temp; 
     } 
     else 
      return null; 

    } 
    void deleteAtIndex(int idx) { 
// TODO to be implemented 

     if(length() >= idx) 
     { 

      if(idx == 0) 
       head = head.getNext(); 
      else 
      { 
       Node temp = findAtIndex(idx-1); 
       temp.setNext(temp.getNext().getNext()); 
      } 
     } 


    } 
    @Override 
    public String toString() { 
     return ""; 

    } 
    void deleteData(Shape s) { 
// TODO to be implemented 
     Node temp = head; 
     for(int i = 0; i < length(); i++) 
     { 
      if(temp.getData() == s) 
       deleteAtIndex(i); 
     } 

    } 
    @Override 
    public int hashCode() { 
// TODO to be implemented 
     return 0; 
    } 
    @Override 
    public boolean equals(Object obj) { 
// TODO to be implemented 

     return false; 
    } 
    // Node is nested class because it only exists along with linked list 
    public static class Node { 
     private Shape data; 
     private Node next; 
// TODO develop all the methods that are needed 
// such as constructors, setters, getters 
// toString, equals, hashCode 
     public Node(Shape S, Node N) 
     { 
      data = S; 
      next = N; 
     } 


     public Node getNext() 
     { 
      return next; 
     } 

     public Shape getData() 
     { 
      return data; 
     } 

     public void setNext(Node N) 
     { 
      next = N; 
     } 
    } 

} 

Circleクラス:

public class Circle implements Shape { 

    private int S; 

    public Circle(int n) 
    { 
     S = n; 
    } 
    public double getPerimeter(){ 

     double p = 2*3.14*S; 
     return p; 
    } 

    @Override 
    public String toString(){ 

     return "Circle{radius=" + S + "} has a perimeter: " + getPerimeter(); 
    } 

    @Override 
    public boolean equals(Object o) 
    { 
     if (this == o) 
      return true; 

     if (o == null) 
      return false; 

     if (getClass() != o.getClass()) 
      return false; 


     return false; 
    } 

    @Override 
    public int hashCode() 
    { 

     return 0; 
    } 

} 

私は、これは間違ってやっている理由は、任意の理由は?この問題を解決するための解決策はありますか?

+0

あなたはたぶんリストの最後から何とか走っているでしょう。デバッグを開始します... –

+0

どういう意味ですか?私はノードを完全に理解するのが初めてです。 – user7014825

+0

あなたはどういう意味ですか、私はあなたがリストの終わりをやめることを意味するのですか? – user7014825

答えて

0

問題は、deleteAtIndexメソッドの長さ()を要求するときにインデックス番号が0から始まることを忘れたことです。 10個の値のリストがある場合、インデックス0〜9が使用されますが、最後の値のインデックスではなく、合計サイズであるdeleteAtIndex(10)を渡しています。だからあなたのdeleteAtIndex方法で

は:。

else 
     { 
      Node temp = findAtIndex(idx-1); 
      temp.setNext(temp.getNext().getNext()); 
     } 

それは最後のインデックスまたはインデックス9.次にんgetNextを()getNextを()を探します。

これは通常、しかし、[OK]を次のようになります。

あなたfindAtIndexに:

 for(int i = 0; i < idx; i++) 
     { 
      temp = temp.getNext(); 
     } 

あなたが9に合格したら、あなたは頭から9以上のノードを移動すると思います。あなたを尾に置いて、しかし、あなたは尾の前の1つのノードになりたがっていました。

関連する問題