トピック:最後から二番目の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のリストを削除
余談:
いわゆる努力がアクティブで、意図的な活動です。
-村上春樹