快慢指针法,要注意,慢指针指向结点的下一个结点才是要删除的结点,如果慢指针指向的结点是要删除的结点,那么就不好删除这个结点。 同样本题需要设置一个yummyhead结点来保证循环的一致性。

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // write code here
        // 删除链表的倒数第n个结点
        // 用快慢指针法解决问题,先让快指针移动n次,然后让快慢指针同步后移
        // 直到快指针为nullptr,这样慢指针指向结点的下一个结点就是要删除的结点
        // 为了保持循环的统一性,需要设置一个yummyhead结点
        if (!head) return head;
        ListNode *yummyhead = new ListNode(-1);
        yummyhead->next = head;
        ListNode *slow = yummyhead, *fast = yummyhead;

        for (int i = 0; i < n && fast->next != nullptr; i++) {
            fast = fast->next;
        }

        // n保证有效,所以就不用判断是否提前到达了表尾
        while(fast->next) {
            slow = slow->next;
            fast = fast->next;
        }

        ListNode *q = slow->next->next;
        slow->next = q;
        return yummyhead->next;

    }
};