使用toString打印链接列表

好的,所以我想学习如何打印链表。 我有我需要用于列表的所有方法,但我无法弄清楚如何显示节点的值。 现在我的main方法中没有任何内容,因为我在主要方法中尝试调用非静态方法时遇到错误。 我有一个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类,它包含操作列表的main和方法:

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

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

正如在其他一些答案和注释中所指出的,这里缺少的是调用JVM System类来打印由toString()方法生成的字符串。

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

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

返回对象的字符串表示forms。 通常,toString方法返回一个“文本表示”此对象的字符串。 结果应该是简洁但信息丰富的表示 ,便于人们阅读。 建议所有子类都覆盖此方法。

增加的重点是我自己的。 您正在创建一个包含链表的整个状态的字符串,有人使用您的类可能没有预料到。 我建议进行以下更改:

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

在LinkedListNode中:

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

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

JVM尝试运行您的应用程序时,它会静态调用您的main方法; 像这样的东西:

 LinkedList.main(); 

这意味着您没有LinkedList类的实例。 为了调用toString()方法,您可以创建LinkedList类的新实例。

所以你的main方法的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()); } 

我这样做的方式如下:

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