删除链表的倒数第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) {
if(head==NULL) return NULL;
ListNode* p=head;
ListNode* q=head;
ListNode* pre=NULL;
int i=n-1;
while(i--){
p=p->next;
}
// while(p!=NULL){//这里这样做会re,因为要p先后移q和pre才能移动不然就可能越界
// pre=q;
// q=q->next;
// p=p->next;
// }
while(p->next!=NULL){
pre=q;
q=q->next;
p=p->next;
}
if(pre==NULL){
head=q->next;
delete q;
}
else{
pre->next=q->next;
delete q;
}
return head;
}
};