返回kth to last:输出不正确

lmyy7pcs  于 2021-06-29  发布在  Java
关注(0)|答案(1)|浏览(514)

**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。

22天前关门了。
改进这个问题
我正在研究一个简单的算法,试图从线性链表中找到最后一个元素的第k个元素,但是,在我的解决方案中,它没有输出我期望的正确数字。
我知道如何解决这个问题,但我想知道为什么头递归不能按我的意图工作。如果再给我一双眼睛我会很感激的。
Package 函数

public int findKthToLast(int kth){
        //If zero items in the list
        if(head == null){
            System.out.println("List is empty");
            return 0;
        }
        //If 1 item in the list
        if(head.getNext() == null){
            System.out.println("Only 1 item in the list which is: " + head.getData());
            return 0;
        }
        //Allocating an array of size 1. This will help me keep track on what kth element when I go back from the recursion
        int[] array = new int[1];
        array[0] = -1;

        //the '1' below represents the length. it will increment as you see in the recursive solution
        return findKthToLast(head,kth,1,array);
    }

递归

public int findKthToLast(Node head,int kth,int length, int [] array){
        //if final item in the list
        if(head.getNext() == null){
            //if kth element is greater then total length just return 0
            if(kth >= length){
                return 0;
            }
            //kth = 0 means output the final item in the list. returns head.data
            if(kth == 0){
                return head.getData();
            }
            //when I backtrack from the stack I need to know if the kth to final element is equal to length. That's where the array comes from
            array[0] = length - kth;
            return 0;
        }
        int element;
        element = findKthToLast(head.getNext(),kth,++length,array);

        //if equal then I'm done. return the head.data
        if(length == array[0]){
            return head.getData();
        }
        return element;

    }

问题是:
在列表中:8->4->2->1。如果kth=1(我希望项目在最后一个之前,因此在本例中值为“2”),则输出应为“2”。但是,在我当前的代码中,我收到了一个更高的数字,因此值“4”
我不要正确的代码。我知道如果我把我的基本情况从

if(head.getNext() == null)
to 
if(head == null)

那么我的代码就完全正常了。我想要的是为什么我现在的解决方案不起作用。我是否错误地可视化了调用堆栈?谢谢您

lnxxn5zx

lnxxn5zx1#

你可能比你自己聪明,因为你有一个非常反常的方法来计算每次递归调用的列表长度。您修改了length变量,以便将增加的长度正确地传递到下一个递归调用中,而不只是向当前长度中添加一个。。。但是,当函数弹出时,使用递增的长度,这会导致计算错误。
让我们通过下面的示例进行一步:

8 -> 4 -> 2 -> 1
findKthToLast(8, 1, 1, [-1])
|
|-> 8.next is NOT null
    |
    | element = findKthToLast(4, 1, ++1, [-1])
      |
      | -> 4.next is NOT null
           |
           | element = findKthToLast(2, 1, ++2, [-1])
             |
             | -> 2.next is NOT null
                  |
                  | element = findKthToLast(1, 1, ++3, [-1])
                    |
                    | -> 1.next IS null
                         | kth is NOT 0
                         | => array[0] <- 4 - 1 = 3 (correct)
                         | return 0
                    | element = 0
                    | length is 4 != 3 because of prefix increment (length should be 3 but you incremented before calling the function)
                    | return 0
             | element = 0
             | length is 3 == 3 because of prefix increment, so return current node
             | return 2 (not correct but this is what you told the code to do)
      | element = 2
      | length is 2 != array[0] 
      | return 2
| return 2

就个人而言,我会选择双指针慢/快的方法,但是如果必须使用递归,那么我会让自己更容易,并维护一个在后面递增的长度计数器(最后一个元素返回0,然后在后续调用中返回0) element + 1 )而是将正确的值存储在数组中。

相关问题