【问题标题】:Printing out a linked list using toString使用 toString 打印出一个链表
【发布时间】:2013-10-17 11:08:51
【问题描述】:

好的,我正在尝试学习如何打印出一个链接列表。我拥有列表需要使用的所有方法,但我不知道如何显示节点的值。现在我的 main 方法中没有任何内容,因为我在尝试调用 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 类,其中包含操作列表的主要方法和方法:

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

【问题讨论】:

  • 你创建你的类的一个实例并在它上面调用toString()
  • 调用toString() 方法。我认为这没有任何问题。
  • 你是什么意思。如果我在我的主方法中调用“toString()”,我会收到一条错误消息“无法对非静态方法 toString() 进行静态引用?
  • 当你说创建一个新实例时,你的意思是这样吗?链表 l = 新链表(); l.toString();
  • 愚蠢的问题:你只是打电话给toString,还是你对结果做了什么(比如System.out.println(I.toString());)? (或者可能是System.out.print,因为结果已经以换行符结尾。)

标签: java linked-list tostring pretty-print


【解决方案1】:
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){
                result += current.getData();
                if(current.getNext() != null){
                     result += ", ";
                }
                current = current.getNext();
            }
            return "List: " + result;
}

【讨论】:

    【解决方案2】:

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

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

    这将完成工作,但我不建议这样做。如果我们查看 Object 类的 javadocs,我们会发现 toString() 的描述如下:

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

    那里添加的重点是我自己的。您正在创建一个字符串,其中包含链表的整个状态,使用您的类的人可能并不期望它。我建议进行以下更改:

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

    在链表节点中:

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

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        我是这样做的:

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

        【讨论】:

          【解决方案5】:

          一个很简单的解决方案是overrideNode中的toString()方法。然后,您可以通过传递LinkedListhead 来调用print。 您不需要实现任何类型的循环。

          代码:

          public class LinkedListNode {
              ...
          
              //New
              @Override
              public String toString() {
                  return String.format("Node(%d, next = %s)", data, next);
              }
          } 
          
          
          public class LinkedList {
          
              public static void main(String[] args) {
          
                  LinkedList l = new LinkedList();
                  l.insertFront(0);
                  l.insertFront(1);
                  l.insertFront(2);
                  l.insertFront(3);
          
                  //New
                  System.out.println(l.head);
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2015-06-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-05-01
            • 1970-01-01
            • 2013-11-18
            • 2014-05-09
            相关资源
            最近更新 更多