【题目描述】
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
【示例1】
![](https://i-blog.csdnimg.cn/blog_migrate/ecdba0341480785d84b043b5839b22ee.png)
输入: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个节点。属于典型的双指针的应用。
如果要删除倒数第n个节点,则可以让快指针fast先移动n步,然后快指针fast和慢指针slow同时移动,直至快指针fast指向链表的末尾,即fast = NULL。
【代码】
暴力解法:
1、这里使用虚拟头节点,这样在删除头节点的操作更方便。
2、首先定义fast指针和slow指针,分别初始化为虚拟头节点。
3、这里快指针fast要先移动n+1步,为什么呢?因为我们要删除一个节点,必须要让慢指针指向该节点的前一个节点,这就造就了fast要先多走n+1步。
4、快慢指针同时移动,直至快指针指向末尾。
5、删除慢指针的下一个节点,即为倒数第n个节点。
C++代码如下:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode *fast = dummyHead;
ListNode *slow = dummyHead;
n++;
while(n-- && fast != nullptr) {
fast = fast->next;
}
while(fast != nullptr) {
fast = fast->next;
slow = slow->next;
}
ListNode *temp = slow->next;
slow->next = slow->next->next;
delete temp;
return dummyHead->next;
}
};