class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(head==NULL) return head;
//先走n步,然后当快指针到达末尾元素时,慢指针的next=next的next;
int i=0;
ListNode * p1=head;
ListNode * p2=head;
ListNode * newhead=NULL;
while(i<n){
p1=p1->next;
i++;
}
if(p1==NULL){//这里需要考虑一个问题,当要删除节点就是头节点时候,也就是p1已经是空了,
newhead=p2->next;//那么直接头就是p2的下一个节点,如果下一个节点有就是下一个节点
p2->next=NULL;//否则就是空。
return newhead;
}
else{
newhead=p2;
while(p1->next!=NULL){//说明删除的不是头节点,那么首先记录下头节点,快慢指针一起走,当p1到达最后一个节点时,p2就是当前要删除节点的前一个节点,然后p2的next指向p2下一个的next即可
p1=p1->next;
p2=p2->next;
}
p2->next = p2->next->next;
return newhead;
}
}
};