**结束。**此问题需要详细的调试信息。它目前不接受答案。
**想改进这个问题吗?**更新问题,使其成为堆栈溢出的主题。
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)
那么我的代码就完全正常了。我想要的是为什么我现在的解决方案不起作用。我是否错误地可视化了调用堆栈?谢谢您
1条答案
按热度按时间lnxxn5zx1#
你可能比你自己聪明,因为你有一个非常反常的方法来计算每次递归调用的列表长度。您修改了length变量,以便将增加的长度正确地传递到下一个递归调用中,而不只是向当前长度中添加一个。。。但是,当函数弹出时,使用递增的长度,这会导致计算错误。
让我们通过下面的示例进行一步:
就个人而言,我会选择双指针慢/快的方法,但是如果必须使用递归,那么我会让自己更容易,并维护一个在后面递增的长度计数器(最后一个元素返回0,然后在后续调用中返回0)
element + 1
)而是将正确的值存储在数组中。