给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1 输出:[]
示例 3:
输入:head = [1,2], n = 1 输出:[1]
思路:
双指针的经典应用,如果要删除倒数第n个节点,让fast移动n步,然后让fast和slow同时移动,直到fast指向链表末尾。删掉slow所指向的节点就可以了。这里引入一个虚拟头结点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode*xhead=new ListNode(0,head);
ListNode*fast=xhead,*slow=xhead;
int i=0;
while(n--&&fast){//fast指针先往前挪n步
fast=fast->next;
}
fast=fast->next;//让fast再往前走一步
while(fast){
fast=fast->next;
slow=slow->next;
}
ListNode*tmp=slow->next;
slow->next=slow->next->next;
delete tmp;//释放内存
return xhead->next;
}
};