【面试题】
编写一个函数,该函数将在一次传递中返回从整数单链表的尾部(或结尾)开始的第 5 个元素,然后针对该函数提供一组测试用例。
它类似于问题:如何从单链表的末尾找到第 n 个元素?,但我有一个额外的要求,我们应该只遍历链表一次。
这是我的解决方案:
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 > 列表长度等。这个采用递归的方法很干净,涵盖了所有这些情况。