[英]Print Singly linked list in reverse using recursion - Java
嗨,我在嘗試使用遞歸以相反的順序打印單鏈接列表時遇到了一些麻煩。 我看了一些示例,但是我的方法沒有任何參數。 我想以以下格式打印出來:
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)
我看不到我在做什么錯,但是我懷疑這可能是我自己調用該方法的方式。 誰能建議我可能做錯了什么以及如何解決?
謝謝!
您正在使事情復雜化。 讓我們看一下偽代碼:
在代碼中,這變為:
public String printReverse() {
return printReverse(head);
}
private String printReverse(Node n) {
return next == null ? "" : (printReverse(next) + n.value);
}
實際上只有兩行代碼-參見KISS 。
關於第二個私有方法,對於遞歸實現的公共方法來說,僅將調用設置為具有適當初始狀態的私有遞歸方法是很常見的。
您不能在方法內部聲明結果變量。 不過,您可以將其作為私有幫助器方法的參數。 這是一個示例實現:
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;
}
Javascript解決方案。
function printReverse(list) {
if (!list) return;
if (list.next) {
printReverse(list.next);
}
console.log(list.value);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.