class Solution {
private:
int deleteLast(int n,ListNode* a){
if(a->next == nullptr) return 1;
int d = deleteLast(n,a -> next) + 1;
if(d == n + 1) a->next = a->next->next;
return d;
}
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode H(0,head);
deleteLast(n,&H);
return H.next;
}
};
这一题需要删除链表的倒数第N个节点,然而链表并不能随机访问,所以我们不能直接定位到倒数第N个节点。
题目要求我们在一次遍历后删除指定节点。
我们注意到,数据范围:
链表中结点的数目为 sz
1 <= sz <= 300 <= Node.val <= 1001 <= n <= sz
链表的长度比较短,最大仅为30,所以我们可以考虑用递归,求出每一个节点从后往前数的序号,并删除倒数第N个节点。
同时注意这里可以通过给原链表增加头节点来进一步简化代码。
题目链接
原创不易,感谢支持!


![[力扣][C++]19. 删除链表的倒数第N个节点 [力扣][C++]19. 删除链表的倒数第N个节点](http://www.mshxw.com/aiimages/31/722331.png)
