删除链表的倒数第 N 个结点

题面

给你一个链表,删除链表的倒数第 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 <= 30
  • 0 <= Node.val <= 100
  • 1 <= 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;
        }
    };
  • 可以使用虚拟头节点来避免被删除的是头结点的问题

这篇文档有帮助吗?

On this page

页面信息