给定一个链表,删除链表的倒数第 n 个节点,并且返回链表的头结点。
示例:
给定一个链表: 1->2->3->4->5, 和 n = 2.
当删除了倒数第二个节点后,链表变为 1->2->3->5.
思路:
使用双指针。创建一个哑结点,定义快慢指针分别从哑结点开始。首先让快指针走n步,之后再多走一步。因为这样快指针指向null时候,慢指针是删除节点的前一个,为了方便删除。
/**
* 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* dummy=new ListNode(0);
dummy->next=head;
ListNode* fast=dummy;
ListNode* slow=dummy;
while(n--&&fast!=nullptr){
fast=fast->next;
}
fast=fast->next; //fast多走一步
while(fast!=nullptr){
fast=fast->next;
slow=slow->next;
}
slow->next=slow->next->next;
auto res=dummy->next;
delete dummy;
return res;
}
};