【インタビューの質問】
単方向にリンクされた整数のリストの末尾 (または末尾) から 5 番目の要素を 1 回のパスで返す関数を作成し、その関数に対する一連のテスト ケースを提供します。
質問に似ています:単方向リストの最後から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;
}
リンクされたリストを 1 回だけトラバースし、暗黙的な再帰スタックを使用しています。もう1つの方法は、2つのポインターを持つことです。高速と低速であり、高速のものは低速のものよりもkポインター高速です.どちらが良いと思われますか? 2 つのポインターを使用したソリューションは、たとえば奇数長のリスト、偶数長のリスト、k > リストの長さなど、多くのケースで複雑になると思います。