簡體   English   中英

使用遞歸反向打印單鏈接列表-Java

[英]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)

我看不到我在做什么錯,但是我懷疑這可能是我自己調用該方法的方式。 誰能建議我可能做錯了什么以及如何解決?

謝謝!

您正在使事情復雜化。 讓我們看一下偽代碼:

  • 初始節點是頭
  • 如果next為null,則打印空白(遞歸終止條件)
  • 否則遞歸到下一個節點
  • 然后打印當前節點

在代碼中,這變為:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM