您好我尝试使用递归以相反的顺序打印单个链接列表时遇到一些麻烦。我看了一些例子,但我的方法没有采用任何参数。我想用以下格式打印出来:
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)
我看不出我做错了什么,但我怀疑这可能是我自己调用方法的方式。任何人都可以建议我可能做错了什么以及如何解决它?
谢谢!
答案 0 :(得分:2)
你过度复杂化了。让我们看看伪代码:
在代码中,这变为:
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);
}