/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
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 <= 30
- 0 <= Node.val <= 100
- 1 <= n <= sz
链表的长度比较短,最大仅为30,所以我们可以考虑用递归,求出每一个节点从后往前数的序号,并删除倒数第N个节点。
同时注意这里可以通过给原链表增加头节点来进一步简化代码。
原创不易,感谢支持!