思路
很明显题意要找到倒数第n个元素,因此用前后双指针能很好解决这个问题,但是因为是删除单链表操作,因此要找到倒数第n+1个。考虑边界情况当n刚好等于链表长度,分两种情况:1、单链表只有一个元素(这种只需要返回null即可);2、单链表不止一个元素(只需要返回头结点前一个即可)。
代码
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *p=head;
for(int i=0;i<n;++i)p=p->next;
if(p==nullptr&&n==1)return nullptr;
if(p==nullptr&&n>1)return head->next;
ListNode *q=head;
while(p->next){
p=p->next;
q=q->next;
}
q->next=q->next->next;
return head;
}
};