删除链表的倒数第 N 个结点
这道题和链表中的倒数第K个结点解法差不多,用快慢指针。因为会涉及到操作头结点,所以我们用虚拟头结点,这样会方便很多。
动图:
代码如下
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//使用快慢指针,因为可能会动头结点,所以使用虚拟头结点
ListNode* dummy = new ListNode(0);
dummy->next = head;
ListNode* slow = dummy,*fast = dummy;
//先让快指针走n步,fast就走到倒数第N个结点了
while(n-- && fast != nullptr) fast = fast->next;
//让fast再多做一步
fast = fast->next;
//快慢指针再同时走
while(fast != nullptr)
{
fast = fast->next;
slow = slow->next;
}
//此时slow就走到N的前一个结点了
slow->next = slow->next->next;
ListNode* phead = dummy->next;
delete dummy;
return phead;
}
};