簡體   English   中英

遞歸返回鏈接列表中的元素數

[英]Return the number of elements in a linked list recursively

我在其中傳遞的頭一類叫做ImageNode以下遞歸方法-從一類稱為圖像( 鏈接列表的開始)。 我以為我的代碼將遞歸地遍歷每個節點,然后增加計數,直到最后返回計數,不幸的是沒有。 我要去哪里錯了?

private int countRec() {
    int count = 1;
    ImageNode node = this;

    if (node.next != null ){
        node = node.next;
        count++;
        countRec();
    }

    return count;
}

您將忽略countRec()的結果-您將在遞歸調用中進行迭代 ,從而countRec()了目標。 (您還對同一對象進行了遞歸調用,沒有參數且狀態沒有改變,因此這樣做無濟於事。)我的遞歸方法將基於以下設計:

  • 如果下一個節點為空,則列表的大小為1
  • 否則,大小為1 +從下一個節點開始的大小。

所以:

private int countRec() {
    return next == null ? 1 : 1 + next.countRec();
}

現在,這當然不允許使用長度為0的列表了……您可能想將列表的概念與節點分開,在這種情況下,列表類將具有以下內容:

public int count() {
    return head == null ? 0 : head.countRec();
}

其中的值head是頭節點的參考,如果有一個,或null否則。

當然,這在時間空間上將是O(n)。 您可以使用迭代而不是遞歸來獲得O(1)空間,只需將列表的大小保留為列表中的實例變量即可獲得O(1)時間,並在需要時進行更新。 我希望這個問題是基於教育要求而不是真實的代碼-在生產代碼中,您將只使用已經提供的集合。

遞歸函數的定義是根據自身定義的:即,如果列表為空,則列表中的元素數等於0;否則為0。 否則等於1 + 列表中其余元素的計數

上面定義的斜體部分是調用函數的地方。

private int countRec(ImageNode node) {
    if (node == null) {
        return 0;
    } else {
        return 1 + countRec(node);
    }
}

當遞歸函數使用進一步調用的結果來解決他的問題時(例如數學上的歸納步驟),它很有用。 您的函數沒有使用countRec()調用的返回值來進行任何操作,並且您仍在嘗試在沒有遞歸幫助的情況下解決問題。 您可以使用它來解決它,如下所示:

if(node.next != null)
{
    node = node.next;
    count = countRec()+1;
}
return count;

當然,由於我們要講的是使您的代碼更好,因此您甚至不需要使用此node var,只需執行以下操作:

private int countRec() {

    if (this.next != null )
        return (this.next.countRec())+1;
    return 1;
}

希望能有所幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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