【问题标题】:Recursive Algorithm to find Kth last element in a linked list递归算法在链表中查找第 K 个最后一个元素
【发布时间】:2022-01-04 03:19:04
【问题描述】:

我是 Java 新手,目前正在阅读“Cracking the Coding Interview”一书以及他们使用 Wrapper Class 在链表中查找第 k 个最后一个元素的方法。我一直在查看代码,但不确定发生了什么。

class Index{
    public int value = 0;
}

LinkedListNode kthToLast(LinkedListNode head, int k){
    Index idx = new Index();
    return kthToLast(head, k, idx);

LinkedListNode kthToLast(LinkedListNode head, int k, Index idx){
    if(head == null){
        return null;}
    LinkedListNode node = kthToLast(head.next, k, idx);
    idx.value = idx.value + 1;
    if (idx.value == k){
        return head;
    }
    return node;
}

有人能解释一下这段代码发生了什么吗?这似乎很混乱。 另外,为什么有 2 个函数 kthToLast 传入不同数量的参数? (最初是 2 个参数,然后是 3 个参数)。

另外对于kthToLast的递归,我很困惑该行之后的代码如何 LinkedListNode node = kthToLast(head.next, k, idx); 将执行,因为它将递归调用自身,并且后续代码将在所有递归调用完成后的某个时间运行。

最后,为什么我们要返回 head return head 以及返回节点 return node ?

如果有人能够解释这段代码中发生的事情的完整过程(以及为什么使用书中所述的 Wrapper 类),我将不胜感激。谢谢!

【问题讨论】:

    标签: java recursion linked-list wrapper


    【解决方案1】:

    链接列表可以用许多不同的方式表示。一种更常见的方法是作为节点列表,其中每个节点通常至少有两件事:一些数据和另一个节点。

    public class LinkedListNode
    {
        int data;
        LinkedListNode next;
    }
    

    为了演示发生了什么,让我们使用这个链表示例,其中 Node2 是您的头节点,我们正在尝试查找 k=2:

    Node2 -> Node1 -> Node0
    

    在第一种方法kthToLast(LinkedListNode head, int k):

    • 使用 value=0 初始化新索引
    • kthToLast(LinkedListNode head, int k, Index idx) 使用您的新索引调用

    从头节点开始,我们通过使用head.next 调用相同的方法,递归地遍历整个链表,直到“基本情况”变为真。用D#表示深度,可以看成:

    D1 - Node2 (head) is NOT null so we skip the if statement
    
    D1 - LinkedListNode node = return value of (D2) recursive call
    
        D2 - Node1 (head) is NOT null so we skip the if statement
    
        D2 - LinkedListNode node = return value of (D3) recursive call
    
            D3 - Node0 (head) is NOT null so we skip the if statement
    
            D3 - LinkedListNode node = return value of (D4) recursive call
    
                D4 - null (head) will return back to Depth 3
    

    现在在第 4 个深度调用了 return 语句,我们将开始返回之前的深度,直到到达第 k 个节点。

            D3 - LinkedListNode node = null
    
            D3 - idx.value = 0 + 1
    
            D3 - 1 != 2 therefore, return node
    
        D2 - LinkedListNode node = null
    
        D2 - idx.value = 1 + 1
    
        D2 - 2 == 2 therefore, return head (Node1)
    
    D1 - LinkedListNode node = Node1
    
    D1 - idx.value = 2 + 1
    
    D1 - 2 != 1 therefore, return node
    

    所以,我们的 LinkedList (Node1) 中的第二个节点被返回。通过递归,它有助于跟踪每个深度的深度、值(和返回值),当然还有你的基本情况。

    【讨论】:

      猜你喜欢
      • 2013-12-10
      • 2014-01-11
      • 1970-01-01
      • 2021-09-10
      • 2019-08-28
      • 2018-08-15
      • 1970-01-01
      • 2015-01-15
      • 2023-03-09
      相关资源
      最近更新 更多