タイトル説明
リストを考えると、削除リストの最後から二番目のn個のノードとヘッドノードは、リストを返します
リスト所与:1-> 2-> 3-> 4-> 5、およびn = 2で
除去した後ときに最後から二番目のノード、リストは、1-> 2-> 3-> 5となります。
問題解決のためのアイデア
- この問題は、我々はリストをサイクルの長さを計算することができますので、それは、非常に簡単であると感じ、その後、削除したい要素を見つけられた場合、これは2段階の問題解決のアイデアでなければなりませんので、うまくそれを削除し、最初のステップは、リストの長さを計算することで、第二のステップは、問題の場所の間に、最後から二番目のn個の要素を削除することであるから、私たちの相互の正の数のn番目の要素が順番に私たちが所有できるミスをしないことですうまく例法を見つけるために、複数のリストを作成します
/**
* 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 length = 0;
ListNode* temp = head;
while(temp != NULL){
temp = temp -> next;
length++;
}//首先利用循环计算出链表的长度,注意这里length是从1开始的
if(n == length){
return head -> next;
}//当n == length时实际上就是删除第一个节点,所以我们要返回的头节点实际上就是原来头结点的下一个结点
int m = length - n - 1;//我们利用规律,倒数第n个实际上就是正数的第length - n - 1个
ListNode* pre = head;
ListNode* cur = head -> next;
while(m > 0){
pre = pre -> next;
cur = cur -> next;
m--;
}
pre -> next = cur -> next;
return head;
}
};
コードの最適化
- 実際にコードを改良し、直接私たちは彼に直接削除を削除したいリストの要素を見つけ、直接彼女の次のノードにノードポイントで彼を聞かせて
/**
* 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) {
if(head == NULL || head -> next == NULL)
return NULL;
ListNode* temp = head;
int length = 0;
while(temp != NULL){
temp = temp -> next;
length++;
}
if(n == length){
head = head -> next;
return head;
}
temp = head;
for(int m = length - n - 1;m > 0;m--)
temp = temp -> next;
temp -> next = temp -> next -> next;
return head;
}
};
問題の解決策
- プログラムを見て、問題に別の解決策を探してください、我々は両手を使って、それを比較的ハイエンドの解決策を見つけました