2013-10-09 50 views
5

好吧,所以我想学习如何打印出一个链表。我有所有需要用于列表的方法,但我无法弄清楚如何显示节点的值。现在我的主要方法中没有任何东西,因为我一直在尝试调用main中的非静态方法时出现错误。我有一个toString方法来显示列表的内容。我将如何去调用这个toString来显示每个节点的值?任何意见将不胜感激。使用toString打印链表

这里是节点类:

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; 
    } 
} 

这里是一个包含主要和方法来操作列表中的LinkedList类:

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

您创建类的实例,并调用'的toString ()'就可以了。 –

+1

调用'的toString()'方法。我没有看到任何问题。 – Prateek

+0

你是什么意思。如果我称之为“的toString()”在我的主要方法,我得到的,说:“不能让一个静态参考非静态方法的toString()的错误? – Shawn

回答

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

JVM尝试运行你的应用程序,它静态地调用你的主要方法;像这样:

LinkedList.main(); 

这意味着没有您的LinkedList类的实例。为了打电话给你的toString()方法,你可以创建一个LinkedList类的新实例。

所以你main方法的主体应该是这样的:

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

正如已指出了一些其他的答案和评论,你在这里失踪是在JVM系统调用类打印出由toString()方法生成的字符串。

LinkedList myLinkedList = new LinkedList(); 
System.out.println(myLinkedList.toString()); 

这将完成工作,但我不会推荐这样做。如果我们看一下Object类的javadoc,我们可以找到toString()的描述:

返回对象的字符串表示形式。通常,toString方法返回一个“文本表示”该对象的字符串。 结果应该是一个简明但内容丰富的表示这对于一个人来说很容易阅读。建议所有子类重写此方法。

这里强调的是我自己的。您正在创建一个包含链接列表整个状态的字符串,有人使用您的类可能不期待。我会推荐以下更改:

  1. 向您的LinkedListNode类添加toString()方法。
  2. 更新LinkedList类中的toString()方法以使其更加简洁。
  3. 向您的LinkedList类中添加一个名为printList()的新方法,该方法执行您当前期望的toString()。

在一个LinkedListNode:

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

在链表:

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

我做了以下的方法:

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(); 
}