利用快慢指针的方法进行,先让快指针走n步,本题里注明了n一定有效,所以不需要对n的有效性进行检查,若需检查请参考二,需要注意的时链表删除的时候需要注意头指针的处理问题
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head) return nullptr;
ListNode* p1 = head;
ListNode* p2 = head;
ListNode* prev;
int i = 0;
while(i<n-1){
p2=p2->next;
i++;
}
//if(!p2) return nullptr;
while(p2->next){
prev=p1;
p1=p1->next;
p2=p2->next;
}
if(p1==head) return head->next;
else prev->next=p1->next;
return head;
}
};
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head) return nullptr;
ListNode* p1 = head;
ListNode* p2 = head;
ListNode* prev;
int i = 0;
while(i<n-1&&p2->next){
p2=p2->next;
i++;
}
if(i<n-1) return nullptr;
while(p2->next){
prev=p1;
p1=p1->next;
p2=p2->next;
}
if(p1==head) return head->next;
else prev->next=p1->next;
return head;
}
};