アルゴリズム意図的実践-LeetCode実際11-は最後から二番目のノードN(C ++)のリストを削除します

トピック:最後から二番目のN個のノードリンクリストを削除

元の質問へのリンク:削除の最後から二番目のN個のノードリンクリスト

この質問への2つのアプローチがトラバーストラバース一度や二度、があります。

直感的に両者を横断する方法であって、ノードの数を取得する最初のパス、その結果、いくつかの正のノードの数に最後から二番目のノード番号、レコードが横断している唯一の変数を介して第2のパスそれは、現在のノードのポインタフィールドドメインは次のノードへのポインタとすることができるように、ノードの前に除去する必要がある場合、ノードは、いくつかの最初のものです。

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        int num = 0;
        ListNode *p = head;
        while(p != NULL)
        {
            num++;
            p = p->next;
        }
        if(num == 1) return NULL; //特判:链表只有一个节点
        if(n == num) return head->next; //特判:删除第一个节点
        int count = 1;
        p = head;
        while(count < num - n)
        {
            count++;
            p = p->next;
        }
        p->next = p->next->next;
        return head;
    }
};

トラバース方法を理解することは困難ですが、非常に巧妙ではない、それは両手を使用することです。n番目のノードへのポインタ1、最初のノードへの2番のポインタ。次に、1番ノードへのテールポインタ、ポインタは正確に2 nは最後から二番目のノード場合を横断開始。怠惰な~~私はもはや再現しません。
公式の答え:最後から二番目のノードNのリストを削除

余談:

いわゆる努力がアクティブで、意図的な活動です。
-村上春樹

公開された16元の記事 ウォンの賞賛0 ビュー276

おすすめ

転載: blog.csdn.net/DZZ18803835618/article/details/104789936