LinkedLIst indexOf递归实现

时间:2016-07-10 14:43:58

标签: java recursion linked-list

我很难理解indexOf() LinkedList的{​​{1}}实现后的递归是如何工作的:

/**
 * 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,那么在int index被声明之前没有else子句的情况下它返回index是什么?这似乎不合法。

当我在调试器中逐步执行它时,而不是返回任何内容它实际上似乎执行更多递归调用,直到满足if条件之一(数据匹配或列表末尾) )。但为什么会这样呢?那么每次1如何添加index

1 个答案:

答案 0 :(得分:3)

  

但是,如果两个条件仍为false,那么在索引声明之前没有else子句会返回int索引是什么?

它还没有返回,它将进入另一个递归级别:

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

然后当条件满足时,它最终返回一个值,然后你开始从之前的每个递归调用回来:

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

但这样做它也会为它返回的索引加1,因此基本上计算你到达的递归级别,它等于你所达到的节点数,这是你要查找的索引。

此图显示了当第四个节点上存在匹配时算法如何工作。蓝色表示我们正在输入递归,红色表示我们从递归中返回(单击图像以原始大小打开它):

Recursion

此另一个图表显示了在第三个节点上匹配时指令的执行顺序(单击图像以原始大小打开它):

Recursion, code execution