查找链表的第 k 到最后一个元素
Finding the kth to the last element of a linked list
我试图递归地实现它,但我不确定为什么这段代码不起作用(假设我有一个 returns 正确的长度函数):
Node findk(Node head, int k) {
if (node_length(head)==k) {
return head; }
else {
return findk(head.next, k-1);}}
谢谢!
您的代码有两个问题:
- 你不应该在列表中递减
k
,并且
- 当列表太短时,你应该注意在到达第
k
个元素之前点击 null
。
这是一种可能的解决方法:
Node findk(Node head, int k) {
if (head == null) return null;
if (node_length(head)==k) return head;
return findk(head.next, k);
}
请注意,此解决方案是 O(n2),因为 node_length
必须是 O(1),每个 N-k
列表的节点。有几种方法可以更快地完成它 - 例如,通过找到 int m = node_length(head)
,然后返回列表开头的第 (m-k)
个节点。
如果你想从末尾找到第K个元素你在递减K的值是错误的,正确的代码如下:
Node findk(Node head, int k) {
if (node_length(head)==k) {
return head;
} else {
return findk(head.next, k);
}
}
另外,我希望您的 node_length() 方法能够处理传递给它的节点为空的情况。
我试图递归地实现它,但我不确定为什么这段代码不起作用(假设我有一个 returns 正确的长度函数):
Node findk(Node head, int k) {
if (node_length(head)==k) {
return head; }
else {
return findk(head.next, k-1);}}
谢谢!
您的代码有两个问题:
- 你不应该在列表中递减
k
,并且 - 当列表太短时,你应该注意在到达第
k
个元素之前点击null
。
这是一种可能的解决方法:
Node findk(Node head, int k) {
if (head == null) return null;
if (node_length(head)==k) return head;
return findk(head.next, k);
}
请注意,此解决方案是 O(n2),因为 node_length
必须是 O(1),每个 N-k
列表的节点。有几种方法可以更快地完成它 - 例如,通过找到 int m = node_length(head)
,然后返回列表开头的第 (m-k)
个节点。
如果你想从末尾找到第K个元素你在递减K的值是错误的,正确的代码如下:
Node findk(Node head, int k) {
if (node_length(head)==k) {
return head;
} else {
return findk(head.next, k);
}
}
另外,我希望您的 node_length() 方法能够处理传递给它的节点为空的情况。