[英]LinkedLIst indexOf recursive implementation
我很難理解LinkedList
的indexOf()
的后續實現中的遞歸是如何工作的:
/**
* 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.