THE
問題
成し遂げる
アイデア
まず、この問題には修正された解決策があります。リンクリストの長さを直接取得することはできず、カウントダウンもわからないため、高速ポインタと低速ポインタ
を使用してnを先に進めることを検討できます。、そして同時に2つ。高速ポインタが移動するとき最後に、低速ポインタはカウントダウンkに到達しました。
- 高速低速ポインタを定義する
- i <kの場合
-
- fast = NULLブレークの場合。
-
-
- fast = fast-> next;
-
- while§
-
- fast ++
-
- 遅い++
- 戻る
まとめと考察
- (fast)は空のステップと同等ですが、ここでは説明しません。ループ条件がfast.nextまたはfastを使用するように統合されているかどうかは、慎重に検討する必要があります。??????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ?????????????????????????????????????????????????? ???????????????????????????????? ここでは、<size()と同等のfastを使用することにしました。また、fast.nextは<= size-1と同等です。
コード
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};
*/
/*
struct ListNode {
int val;
struct ListNode *next;
ListNode(int x) :
val(x), next(NULL) {
}
};*/
class Solution {
public:
ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
auto fast = pListHead;
auto slow = pListHead;
for(unsigned int i= 0 ;i<k;i++){
if(!fast) return NULL;
else fast = fast->next;
}
while(fast){
fast = fast->next;
slow = slow->next;
}
return slow;
}
};