0

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

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)

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

谢谢!

4

3 回答 3

2

你把事情复杂化了。让我们看一下伪代码:

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

在代码中,这变为:

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

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

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

关于第二个私有方法,递归实现的公共方法很常见,只需将调用设置为具有适当初始状态的私有递归方法。

于 2013-05-15T05:29:53.630 回答
1

您不能在方法内声明结果变量。不过,您可以将其作为私有辅助方法的参数。这是一个示例实现:

public String printReverse(Elem elem) {
    return internalReverse(elem, new StringBuilder("[")).append("]").toString();
}
private StringBuilder internalReverse(Elem elem, StringBuilder result) {
    if (elem != null) { // base case
        result.append(internalReverse(elem.next, result));                
        if (result.size() > 1) {
            result.append(", ")
        }            
        result.append(elem);
    }
    return result;
}
于 2013-05-15T04:52:55.110 回答
0

一个Javascript解决方案。

function printReverse(list) {
    if (!list) return;
    if (list.next) {
        printReverse(list.next);  
    }
    console.log(list.value);
}
于 2014-11-19T22:30:27.283 回答