LeetCode-19-チェーンテーブルの最後からN番目のノードを削除

1287 ワード

LeetCode-19-チェーンテーブルの最後からN番目のノードを削除
タイトル
チェーンテーブルが与えられ、チェーンテーブルの最後からn番目のノードが削除され、チェーンテーブルのヘッダノードが返される.
例:
チェーンテーブルが与えられる:1->2->3->4->5、およびn=2.
最後から2番目のノードを削除すると、チェーンテーブルは1->2->3->5になります.説明:
与えられたn保証は有効である.
ステップ:
スキャンを使って実現してみてもいいですか?
ソース:力ボタン(LeetCode)リンク:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list著作権はインターネットの所有に帰属する.商業転載は公式の授権に連絡してください.非商業転載は出典を明記してください.
問題を解く構想.
これは実は比較的よく見られるチェーンテーブルの問題で、チェーンテーブルのいくつかのアルゴリズムの問題に触れたことがあるならば.解法は、二重ポインタa,bが使用され、ba以降のn-1番目のノードである場合、a/bが同時に後方に移動し、bが末尾に移動すると、aが逆数のn番目のノードを指す.もちろん、aの前駆ノードを指すポインタも必要である.
C++実装
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(!head)   return head;

        ListNode *prev = NULL;
        ListNode *a = head;
        ListNode *b = a;
        for(int i = 0; i < n - 1; i++)
            b = b->next;

        while(b->next)
        {
            prev = a;
            a = a->next;
            b = b->next;
        }

        if(!prev)
            return a->next;

        prev->next = a->next;

        return head;
    }
};