别想花里胡哨的了。。倒置删除再倒置吧,复杂度也就n,就是代码长了点

/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode(int x) : val(x), next(NULL) {}
* };
*/
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode *p = head;
ListNode *firstNode = new ListNode(p->val);
p = p->next;
ListNode *temp;
//Reverse
while (p) {
temp = new ListNode(p->val);
temp->next = firstNode;
firstNode = temp;
ListNode *d = p;
p = p->next;
delete d;
}

//Remove
p = firstNode;
if (n == 1)firstNode = firstNode->next;
else
{
while (n - 2) {
--n;
p = p->next;
}
if(p->next->next)p->next = p->next->next;
else p->next = NULL;
}
//Reverse
p = firstNode;
if(p)head = new ListNode(p->val);
else return p;
p = p->next;
while (p) {
temp = new ListNode(p->val);
temp->next = head;
head = temp;
ListNode* d = p;
p = p->next;
delete d;
}
return head;
}
};