タイトル説明
ヘッドノードリストにリスト、n個のノードの削除リストの逆数とリターンを考えます。
思考
- 再反復は、位置、削除スキップビットを削除する前に、まず、リストのレコード長を横断します。この方法では、二回横断する必要があり
- それは端Aに達したときに、開始の出発点に二重ポインタ、開始点Aを指すポインタ、場合ポインタN + 1段階A進み、ポインタB点を通過する、Bは、削除ノードの前のポイントであることを起こります
コード
この方法の一つ:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head == NULL)
return NULL;
ListNode* cur = head;
int count = 0;
while(cur!= NULL)
{
count++;
cur = cur->next;
}
if(n == count)
return head->next;
if(n == 0)
return head;
cur = head;
int i = 0;
while(i < count-n-1)
{
cur = cur->next;
i++;
}
if(cur->next->next)
{
cur->next = cur->next->next;
}
else
{
cur ->next = NULL;
}
return head;
}
};
方法2:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(NULL);
dummy->next = head; //添加头节点,便于操作
ListNode* slow=dummy,* fast=dummy;
int distance=0;
while(fast->next){
if(distance<n){
fast=fast->next;
distance++;
}else{
fast=fast->next;
slow=slow->next;
}
}
slow->next=slow->next->next;
return dummy->next;
}
};