删除倒数第k个节点,和返回倒数第k个节点一样,双指针法,q先移动k步,然后p、q一块移动。不同的是,最后q要停留在最后一个节点而不是NULL上,这样,p停留在倒数第k前一个节点上,然后删除节点操作。特殊情况:需要删除的是head,这时候第一步q已经是NULL了。
ListNode *removeNthFromEnd(ListNode *head, int n) {
ListNode dummy(-1);
dummy.next = head;
auto q = head;
int i = 0;
for (; q && i < n; q = q->next, ++i) ;
if (i < n) return head;
auto p = &dummy;
for (; q; p = p->next, q = q->next) ;
auto tmp = p->next;
p->next = tmp->next;
delete tmp;
return dummy.next;
}