使用递归打印单一链接列表 - Java

时间:2013-05-15 04:42:19

标签: java singly-linked-list

您好我尝试使用递归以相反的顺序打印单个链接列表时遇到一些麻烦。我看了一些例子,但我的方法没有采用任何参数。我想用以下格式打印出来:

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

首先引用我单链表中的第一个节点,然后使用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)

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

谢谢!

3 个答案:

答案 0 :(得分:2)

你过度复杂化了。让我们看看伪代码:

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

在代码中,这变为:

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

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

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

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

答案 1 :(得分: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;
}

答案 2 :(得分:0)

Javascript解决方案。

function printReverse(list) {
    if (!list) return;
    if (list.next) {
        printReverse(list.next);  
    }
    console.log(list.value);
}