原题链接:https://leetcode-cn.com/problems/remove-nth-node-from-end-of-list/
双指针法
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* p=new ListNode;//新建头结点并且将前指针指向它
p->next=head;
ListNode* q=head;//后指针
while(n--){//根据n后移后指针
q=q->next;
}
while(q!=NULL){//将后指针一直移动到链表结尾
p=p->next;
q=q->next;
}
ListNode *tmp=p->next;//开始删除
p->next=tmp->next;
if(tmp==head) head=tmp->next;//如果删除的结点为头结点,则将头结点指针head往后移
delete tmp;
return head;
}
优化
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *pre=new ListNode;//多设置一个pre指针,可以避免最后的判断
pre->next=head;
ListNode *p=pre,*q=head;
while(n--){
q=q->next;
}
while(q!=NULL){
p=p->next;
q=q->next;
}
ListNode *tmp=p->next;
p->next=tmp->next;
delete tmp;
return pre->next;
}