https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/

<aside> 💡

思路:设计两个指针(快慢指针),让两者中间相隔n个节点。再让右侧指针指向链表尾后节点(即一个空节点),则左侧节点的下一节点即是倒数第N个节点

由于需要涉及对节点的操作(删除节点),所以需要设置虚拟头节点

</aside>

ListNode* removeNthFromEnd(ListNode* head, int n) {
    ListNode* dummyHead = new ListNode();
    dummyHead->next = head;

    ListNode* slow = dummyHead;
    ListNode* fast = dummyHead;

		// 快指针移动n步
    for (int i = 0; i < n; ++i) {
        fast = fast->next;
    }

		// 让快指针向前移动,直到fast->next指向尾后
		// 慢指针同步移动
    while (fast->next) {
        slow = slow->next;
        fast = fast->next;
    }

		// 此时慢指针指向的就是倒数第n个节点
    ListNode* tmp = slow->next->next;
    delete slow->next;
    slow->next = tmp;

    head = dummyHead->next;
    delete dummyHead;
    return head;
}