19. 删除链表的倒数第 N 个结点
思路:
这个题就直接的方法很容易想到,两次遍历,第一次得到正向到n的长度,第二次就找到这个节点即可。
一次遍历的方法能自己想到了,就快慢指针。但是自己想的方法太多边界处理不好了,最后还是使用了题解的方法。
我自己想到的是 每次都用cnt用来计数,当cnt==n的时候就移动慢指针,当快指针为空的时候就停下来,但是这里就有很多边界条件难以用统一的方法处理,就丢弃了。但思路没有错,就是通过计数移动来保持快慢指针的一个距离,当快指针为null时,慢指针应该知道倒数第n个节点的前一个结点,他俩保持的距离就是n。
那么通过这个想法,我们可以考虑先把快指针移动n个位置,在同时移快慢指针即可。就避免了很多边界条件。实在是妙啊
代码:
/**
* 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 {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummy = new ListNode(0,head);
ListNode* cur=head;
ListNode* pren=dummy;
for(int i=0;i<n;++i){
cur=cur->next;
}
while(cur){
pren = pren->next;
cur = cur->next;
}
pren->next = pren->next->next;
return dummy->next;
}
};