java - 使用递归反向打印单链表 - Java

标签 java singly-linked-list

嗨,我在尝试使用递归以相反的顺序打印单链表时遇到了一些麻烦。我看过一些例子,但我的方法不带任何参数。我想按以下格式打印出来:

input: [1, 2, 3, 4, 5] and output:[5, 4, 3, 2, 1]

first 指的是单链表中的第一个节点,我使用 StringBuilder 来构建列表,以便我可以在最后返回它。

这是我到目前为止所拥有的:

public String printReverse() {
    StringBuilder myString = new StringBuilder("[");
    if (head != null) { // base case
        head = head.next;
        myString.append(head.value);   // line 406
        myString.append(", ");         // line 407
        printReverse();                // line 408
    }
    myString = myString.append("]");
    return myString.toString();
}

我收到以下错误:

Exception in thread "main" java.lang.NullPointerException
    at myprog.SLL$Node.access$100(SLL.java:445)

    at myprog.SLL.printReverse(SLL.java:406)

    at myprog.SLL.printReverse(SLL.java:408)

    at myprog.SLL.printReverse(SLL.java:408)

    at myprog.SLL.printReverse(SLL.java:408)

    at myprog.SLL.printReverse(SLL.java:408)

    at myprog.SLLApp.myMethod(SLLApp.java:198)

    at myprog.SLLApp.<init>(SLLApp.java:37)

    at myprog.SLLApp.main(SLLApp.java:26)

我不明白我做错了什么,但我怀疑这可能是我调用该方法本身的方式。谁能建议我可能做错了什么以及如何解决它?

谢谢!

最佳答案

你把事情搞得太复杂了。我们看一下伪代码:

  • 初始节点是头节点
  • 如果 next 为 null 则打印空白(递归终止条件)
  • 否则递归到下一个节点
  • 然后打印当前节点

在代码中,这变成:

public String printReverse() {
    return printReverse(head); 
}

private String printReverse(Node n) {
    return next == null ? "" : (printReverse(next) + n.value);
}

实际上只有两行代码 - 请参阅 KISS .

关于第二个私有(private)方法,递归实现的公共(public)方法通常只是将 ip 设置为具有适当初始状态的私有(private)递归方法的调用。

关于java - 使用递归反向打印单链表 - Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16557012/

相关文章:

java - 如何从传递到方法的节点访问信息?

java - 在 Android 中实现 AES 加密

javascript - JavaScript 中的单链表中的 Set 如何与 Get 一起使用?

c - 我不明白deleteall(key)函数中这条语句 "cur = prev->next;"的逻辑

c - 栈的链表实现

java - 在单链表中添加和删除

java - 如何启用 Hystrix DEBUG 级别的日志记录

java - 从servlet调用jsp文件

java - 我应该有一个对象作为属性或原始 id 吗?

c - 为什么无法在该链表的索引0(头)处插入新节点?