簡體   English   中英

LinkedLIst indexOf遞歸實現

[英]LinkedLIst indexOf recursive implementation

我很難理解LinkedListindexOf()的后續實現中的遞歸是如何工作的:

/**
 * Returns the position of the first occurrence of the 
 * given character in this list, or -1 if there is no 
 * such occurrence.
 */
public int indexOf(char c)
{
    if (this.head == null)
    {
        return -1;
    }
    else
    {
        return LinkedList.indexOf(c, this.head);
    }
}
private static int indexOf(char c, Node node)
{
    if (node.data == c)
    {
        return 0;
    }
    if (node.next == null)
    {
        return -1;
    }
    int index = LinkedList.indexOf(c, node.next);
    if (index == -1)
    {
        return -1;
    }
    else
    {
        return 1 + index;
    }
}

其中head是列表中的初始節點(“link”)。

static indexOf()方法檢查頭部是否存在數據匹配,然后檢查是否存在下一個節點。 假設兩個條件都是false (沒有數據匹配,並且存在下一個節點)。 然后在下一個(第二個)節點上遞歸調用indexOf()以執行相同的檢查。 但是,如果兩個條件仍為false ,那么在聲明index之前沒有else子句的情況下它返回int index index是什么? 這似乎不合法。

當我在調試器中逐步執行它時,而不是返回任何東西,它實際上似乎做了更多的遞歸調用,直到滿足if條件之一(數據匹配或列表的末尾到達)。 但為什么會這樣呢? 然后每次如何將1添加到index

但是,如果兩個條件仍為false,那么在聲明index之前沒有else子句的情況下它返回int索引是什么?

它還沒有返回,它將進入另一個遞歸級別:

indexOf(node) -> indexOf(node.next) -> indexOf(node.next.next) -> ...

然后,當滿足條件時,它最終返回一個值,然后您開始從之前進行的每個遞歸調用返回:

indexOf(node) <- indexOf(node.next) <- indexOf(node.next.next) <- ...

但是這樣做它也會在它返回的索引中加1,因此基本上計算你到達的遞歸級別,它等於你達到的節點數,這是你要查找的索引。

此圖顯示了當第四個節點上存在匹配時算法如何工作。 藍色表示我們正在輸入遞歸,紅色表示我們從遞歸返回(單擊圖像以原始大小打開它):

遞歸

此另一個圖顯示了在第三個節點上匹配時指令的執行順序(單擊圖像以原始大小打開它):

遞歸,代碼執行

暫無
暫無

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

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