题面
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:

输入: head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
示例 2:
输入: head = [1], n = 1 输出:[]
示例 3:
输入: head = [1,2], n = 1 输出:[1]
提示:
- 链表中结点的数目为
sz 1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
进阶: 你能尝试使用一趟扫描实现吗?
分析
-
参考之前寻找链表中间节点的思路,可以维护两个指针,一个指针先移动 k 步,然后两个指针一起移动,这样快指针移动到末尾时,满指针就是倒数第 K 个节点
-
代码实现
/** * 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) { if (head == nullptr || head->next == nullptr) return nullptr; ListNode* dummy = new ListNode(0); dummy->next = head; ListNode *slow = dummy, *fast = dummy, *pre = dummy; while (n--) { fast = fast->next; } while (fast != nullptr) { fast = fast->next; pre = slow; slow = slow->next; } pre->next = slow->next; delete slow; return dummy->next; } }; -
可以使用虚拟头节点来避免被删除的是头结点的问题
这篇文档有帮助吗?