/**
 * struct ListNode {
 *    int val;
 *    struct ListNode *next;
 * };
 */

class Solution {
public:
    /**
     * 
     * @param head ListNode类 
     * @param n int整型 
     * @return ListNode类
     */
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        // write code here
        if(!head || !n)
            return head;
        if(n == 1 && !head->next)
            return nullptr;
        ListNode* reHead = reverseList(head);
        ListNode* tmpHead = reHead;
        if(n == 1)
        {
            ListNode* tmp = tmpHead->next;
            return reverseList(tmp);
        }

        while(n--)
        {
            if(n == 1)
            {
                ListNode* tmp = tmpHead->next->next;
                tmpHead->next = tmp;
            }
            else
                tmpHead = tmpHead->next;
        }
        return reverseList(reHead);
    }

    ListNode* reverseList(ListNode* head)
    {
        if(!head || !head->next)
            return head;
        ListNode* ret = nullptr;
        while(head)
        {
            ListNode* tmp = head->next;
            head->next = ret;
            ret = head;
            head = tmp;
        }
        return ret;
    }

};