我试图实现这个递归,但我不知道为什么这段代码不起作用(这是假设我有一个长度函数返回正确):找到第k个链接列表的最后一个元素
Node findk(Node head, int k) {
if (node_length(head)==k) {
return head; }
else {
return findk(head.next, k-1);}}
谢谢!
我试图实现这个递归,但我不知道为什么这段代码不起作用(这是假设我有一个长度函数返回正确):找到第k个链接列表的最后一个元素
Node findk(Node head, int k) {
if (node_length(head)==k) {
return head; }
else {
return findk(head.next, k-1);}}
谢谢!
有两个问题与您的代码:
k
因为你走的列表,并null
达到k
个当元素之前名单太短。这里是一个可能的修正:
Node findk(Node head, int k) {
if (head == null) return null;
if (node_length(head)==k) return head;
return findk(head.next, k);
}
注意,该溶液是O(n ),因为node_length
,它必须是O(1),被称为用于每个N-k
节点的名单。有几种方式可以更快速地执行此操作 - 例如,查找int m = node_length(head)
,然后从列表的开头返回(m-k)
-第n个节点。
堆栈上是否有可能发生的问题?我正在阅读Cracking the Coding interview,作者说我们不能“回传节点通过堆栈”递归回答这个问题 – honeysingh 2015-01-09 20:01:51
@honeysingh当列表太多时,这里最大的与堆栈相关的问题会溢出堆栈长。但是,如果编译器执行尾部调用优化,则不会有问题。 – dasblinkenlight 2015-01-09 20:04:54
如果你想找到你到底是递减ķ这是错误的值所述K元素,正确的代码如下:
Node findk(Node head, int k) {
if (node_length(head)==k) {
return head;
} else {
return findk(head.next, k);
}
}
而且我希望你node_length()方法负责处理传递给它的节点为空的场景。
你需要返回什么?第K个元素的位置? – Kakarot 2015-01-09 19:41:13
你正在旋转成无限递归吗?当head.next为空时会发生什么?是否有堆栈跟踪? – 2015-01-09 19:43:01
你的意思是不工作?你想从头到尾找到第K个元素吗? – Kakarot 2015-01-09 19:43:11