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