使用 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 类,其中包含操作列表的 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){
                result += current.getData();
                if(current.getNext() != null){
                     result += ", ";
                }
                current = current.getNext();
            }
            return "List: " + result;
}

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

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

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

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

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

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

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

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

我按以下方式执行此操作:

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

一个非常简单的解决方案是在Nodeoverride 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);
    }
}

对于@Marin代码,它不包括列表是否为空或列表仅包含 1 个节点。所以这里有改进的代码:

 @Override
public String toString() {
    String result = "";
    LinkedListNode dummy = head;
    if (dummy == null) { //if list is empty return result
        return result;
    }else if(dummy.getNext() == null){ //if the list contains only 1 node
        result += dummy.getData();
        return result;
    }else{
        while(dummy != null){
            result += dummy.getData();
            if(dummy.getNext()!= null){
                result += " ";
            }
            dummy = dummy.getNext();
        }
        return result;
    }
    
    
}

相关内容

  • 没有找到相关文章

最新更新