2013-10-09 11 views
5

Ok Leute, also versuche ich zu lernen, wie man eine verknüpfte Liste ausdruckt. Ich habe alle Methoden, die ich für die Liste verwenden müsste, aber ich kann nicht herausfinden, wie die Werte der Knoten angezeigt werden. Im Moment gibt es nichts in meiner Hauptmethode, weil ich immer Fehler bekommen habe, die versuchen, nicht-statische Methoden in der Hauptsache aufzurufen. Ich habe eine toString-Methode, die den Inhalt der Liste anzeigt. Wie würde ich diesen String toString aufrufen, um den Wert jedes Knotens anzuzeigen? Jeder Rat wird sehr geschätzt. HierAusdrucken einer verketteten Liste mit toString

ist die Knotenklasse:

public class LinkedListNode 
{ 

    private int data; 
    private LinkedListNode next; 


    public LinkedListNode(int data) 
    { 
     this.data = data; 
     this.next = null; 
    } 

    public int getData() 
    { 
     return data; 
    } 

    public void setData(int d) 
    { 
     data = d; 
    } 

    public LinkedListNode getNext() 
    { 
     return next; 
    } 

    public void setNext(LinkedListNode n) 
    { 
     next = n; 
    } 
} 

Hier ist die LinkedList Klasse, die die Haupt- und Methoden enthält die Liste zu bearbeiten:

public class LinkedList { 

    public LinkedListNode head; 

    public static void main(String[] args) { 

    LinkedList l = new LinkedList(); 
    l.insertFront(0); 
    System.out.println(l.toString()); 

    } 

    public LinkedList() { 
     this.head = null; 
    } 

    public int removeFront(){ 
     if(head == null){ 
      System.out.println("Error - Attempting to call removeFront() on empty list"); 
      return 0; 
     }else{ 
      int temp = head.getData(); 
      head = head.getNext(); 
      return temp; 
     } 

    } 

    public void insertFront(int data){ 
     if(head == null){ 
      head = new LinkedListNode(data); 
     }else{ 
      LinkedListNode newNode = new LinkedListNode(data); 
      newNode.setNext(head); 
      head = newNode; 
     }  
    } 

    public void insertBack(int data){ 
     if(head == null){ 
      head = new LinkedListNode(data); 
     }else{ 
      LinkedListNode newNode = new LinkedListNode(data); 
      LinkedListNode current = head; 
      while(current.getNext() != null){ 
       current = current.getNext(); 
      } 
      current.setNext(newNode); 
     }  
    } 

    public int removeBack(){ 
     if(head == null){ 
      System.out.println("Error - Attempting to call removeBack() on empty list"); 
      return 0; 
     }else if (head.getNext() == null){ 
      int temp = head.getData(); 
      head = null; 
      return temp; 
     }else{ 

      LinkedListNode current = head; 
      while(current.getNext().getNext() != null){ 
       current = current.getNext(); 
      } 
      int temp = current.getNext().getData(); 
      current.setNext(null); 
      return temp; 
     }  
    } 

    public String toString(){ 
     String retStr = "Contents:\n"; 

     LinkedListNode current = head; 
     while(current != null){ 
      retStr += current.getData() + "\n"; 
      current = current.getNext(); 

     } 

     return retStr; 
    } 

    public LinkedListNode getHead() { 
     return head; 
    } 

    public void setHead(LinkedListNode head) { 
     this.head = head; 
    } 
} 
+2

Sie eine Instanz der Klasse erstellen und rufen 'toString() 'darauf. –

+1

Rufen Sie die 'toString()' Methode auf. Ich sehe darin kein Problem. – Prateek

+0

Wie meinst du das? Wenn ich "toString()" in meiner Hauptmethode aufruft, erhalte ich einen Fehler, der besagt "Kann nicht einen statischen Verweis auf die nicht-statische Methode toString()? – Shawn

Antwort

6
public static void main(String[] args) { 

    LinkedList list = new LinkedList(); 
    list.insertFront(1); 
    list.insertFront(2); 
    list.insertFront(3); 
    System.out.println(list.toString()); 
} 

String toString() { 
      String result = ""; 
      LinkedListNode current = head; 
      while(current.getNext() != null){ 
       current = current.getNext(); 
       result += current.data + ", "; 
      } 
      return "List: " + result; 
} 
1

Wenn die JVM versucht Ihre Anwendung auszuführen, es ruft Ihre Hauptmethode statisch auf; so etwas wie dieses:

LinkedList.main(); 

Das bedeutet, dass es keine Instanz Ihrer LinkedList Klasse. Um Ihre Methode toString() aufzurufen, können Sie eine neue Instanz Ihrer Klasse LinkedList erstellen.

So ist der Körper Ihres main Methode sollte wie folgt sein:

public static void main(String[] args){ 
    // creating an instance of LinkedList class 
    LinkedList ll = new LinkedList(); 

    // adding some data to the list 
    ll.insertFront(1); 
    ll.insertFront(2); 
    ll.insertFront(3); 
    ll.insertBack(4); 

    System.out.println(ll.toString()); 
} 
3

Wie bereits in einigen anderen Antworten und Kommentaren darauf hingewiesen, was Sie vermissen hier ist ein Aufruf der JVM-System Klasse, um die von Ihrer toString() - Methode generierte Zeichenfolge auszugeben.

Dies wird die Arbeit erledigen, aber ich würde nicht empfehlen, es so zu tun. Wenn wir einen Blick auf die javadocs für die Objektklasse nehmen wir diese Beschreibung für toString() finden:

Gibt eine String-Darstellung des Objekts. Im Allgemeinen gibt die Methode toString eine Zeichenfolge zurück, die dieses Objekt "textuell" darstellt. Das Ergebnis sollte eine kurze aber informative Darstellung sein, die für eine Person einfach zu lesen ist. Es wird empfohlen, dass alle Unterklassen diese Methode überschreiben.

Die Betonung hinzugefügt dort ist meine eigene. Sie erstellen eine Zeichenfolge, die den gesamten Status der verknüpften Liste enthält, die von jemandem, der Ihre Klasse verwendet, wahrscheinlich nicht erwartet wird. Ich würde die folgenden Änderungen empfehlen:

  1. Fügen Sie Ihrer LinkedListNode-Klasse eine toString() -Methode hinzu.
  2. Aktualisieren Sie die toString() - Methode in Ihrer LinkedList-Klasse, um präziser zu sein.
  3. Fügen Sie eine neue Methode namens printList() zu Ihrer LinkedList-Klasse hinzu, die das ausführt, was Sie derzeit von toString() erwarten.

In LinkedListNode:

public String toString(){ 
    return "LinkedListNode with data: " + getData(); 
} 

In LinkedList:

public int size(){ 
    int currentSize = 0; 
    LinkedListNode current = head; 
    while(current != null){ 
     currentSize = currentSize + 1; 
     current = current.getNext(); 
    } 

    return currentSize; 
} 

public String toString(){ 
    return "LinkedList with " + size() + "elements."; 
} 

public void printList(){ 
    System.out.println("Contents of " + toString()); 

    LinkedListNode current = head; 
    while(current != null){ 
     System.out.println(current.toString()); 
     current = current.getNext(); 
    } 

} 
0

ich es die folgende Art und Weise tun:

public static void main(String[] args) { 

    LinkedList list = new LinkedList(); 
    list.insertFront(1); 
    list.insertFront(2); 
    list.insertFront(3); 
    System.out.println(list.toString()); 
} 

String toString() { 
    StringBuilder result = new StringBuilder(); 
    for(Object item:this) { 
     result.append(item.toString()); 
     result.append("\n"); //optional 
    } 
    return result.toString(); 
}