2015-01-09 292 views
1

我试图实现这个递归,但我不知道为什么这段代码不起作用(这是假设我有一个长度函数返回正确):找到第k个链接列表的最后一个元素

Node findk(Node head, int k) { 
    if (node_length(head)==k) { 
     return head; } 
    else { 
     return findk(head.next, k-1);}} 

谢谢!

+0

你需要返回什么?第K个元素的位置? – Kakarot 2015-01-09 19:41:13

+0

你正在旋转成无限递归吗?当head.next为空时会发生什么?是否有堆栈跟踪? – 2015-01-09 19:43:01

+0

你的意思是不工作?你想从头到尾找到第K个元素吗? – Kakarot 2015-01-09 19:43:11

回答

0

有两个问题与您的代码:

  • 你不应该递减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个节点。

+0

堆栈上是否有可能发生的问题?我正在阅读Cracking the Coding interview,作者说我们不能“回传节点通过堆栈”递归回答这个问题 – honeysingh 2015-01-09 20:01:51

+0

@honeysingh当列表太多时,这里最大的与堆栈相关的问题会溢出堆栈长。但是,如果编译器执行尾部调用优化,则不会有问题。 – dasblinkenlight 2015-01-09 20:04:54

0

如果你想找到你到底是递减ķ这是错误的值所述K元素,正确的代码如下:

Node findk(Node head, int k) { 
    if (node_length(head)==k) { 
    return head; 
    } else { 
    return findk(head.next, k); 
    } 
} 

而且我希望你node_length()方法负责处理传递给它的节点为空的场景。

相关问题