【发布时间】:2013-02-17 04:53:23
【问题描述】:
【面试题】
编写一个函数,该函数将一次性返回整数单链表尾部(或尾部)的第 5 个元素,然后针对该函数提供一组测试用例。
类似于问题:How to find nth element from the end of a singly linked list?,但我有一个额外的要求,我们应该只遍历链表一次。
这是我的解决方案:
struct Lnode
{
int val;
Lnode* next;
Lnode(int val, Lnode* next=NULL) : val(val), next(next) {}
};
Lnode* kthFromTail(Lnode* start, int k)
{
static int count =0;
if(!start)
return NULL;
Lnode* end = kthFromTail(start->next, k);
if(count==k) end = start;
count++;
return end;
}
我只遍历链表一次并使用隐式递归堆栈。另一种方法是有两个指针:快速和慢速,快速的指针比慢速指针快 k 指针。哪个似乎更好?我认为使用两个指针的解决方案会很复杂,例如:奇数长度列表、偶数长度列表、k > 列表长度等。这个采用递归的方法很干净,涵盖了所有这些情况。
【问题讨论】:
-
我想到的两指针解决方案很简单,唯一的特殊情况是如果列表的长度是
< k。这在某种程度上对应于您的if (count == k)条件。 -
@dacwe。我还能如何计算从末端遍历的节点数?
标签: algorithm recursion linked-list