题目
给你一个链表,删除链表的倒数第 n
个结点,并且返回链表的头结点。
解题思路
由于题目中给出的是倒数第N个,我们又不知道链表里总共有多少个,就采用双指针的办法,同时为了不考虑头节点删除的情况引入虚头结点,代码如下
//创建虚头节点的双指针法
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* dummyHead = new ListNode(-1, head);
ListNode* slow = dummyHead;
ListNode* fast = dummyHead;
//采用n + 1 是因为保证slow是指向删除的前置元素
for (int i = 0; i < n + 1 ; ++i)
{
fast = fast->next;
}
while (fast != nullptr)
{
fast = fast->next;
slow = slow->next;
}
//此时slow指向的是要删除的前置元素
ListNode* imp = slow->next;
slow->next = imp->next;
delete imp;
return dummyHead->next;
}
};