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

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        if (head == nullptr) return nullptr; // 如果链表为空,直接返回nullptr

        ListNode* a = new ListNode(); // 创建一个新的辅助节点a
        ListNode* b = a; // 创建另一个指针b,指向a
        ListNode* c = a; // 创建另一个指针c,也指向a

        a->next = head; // 将a的下一个节点设置为头节点
        b->next = head; // 将b的下一个节点设置为头节点

        // 将指针a向前移动n个节点
        while (n--) {
            a = a->next;
        }

        // 移动指针a和b,直到a到达链表末尾
        while (a->next != nullptr) {
            a = a->next;
            b = b->next;
        }

        // 删除倒数第n个节点
        if (b->next != nullptr) {
            ListNode* t = b->next; // 指向需要删除的节点
            b->next = t->next; // 将b的下一个节点设置为t的下一个节点
            delete t; // 删除t节点
        }

        ListNode* re = c->next; // 获取修改后链表的头节点
        delete c; // 删除辅助节点c
        return re; // 返回新链表的头节点
    }
};