繁体   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