使用一遍扫描删除倒数第n个节点 使用了两个指针 并且固定两个指针间的距离为n+1 当第二个指针到达了null处 则删除第一个指针所指的后一个节点
/**
* 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) {
ListNode* v = new ListNode(0);
v->next = head;
//首先创建虚拟头节点 并且把这个节点作为头结点 这是为了防止删除的是第一个节点
ListNode* first = v;
ListNode* seconed = first;
for(int i=0;i<n+1;i++)
{
seconed = seconed->next;
}
while(seconed!=nullptr)
{
first=first->next;
seconed=seconed->next;
} //first指针移到要删除的节点的前驱结点 这时seconed指针指向null
//下面进行删除操作
ListNode* deleNode =first->next;
first->next = deleNode->next;
ListNode* ans = v->next;
delete deleNode;//记得把节点删了
return ans;
}
};