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;

    }
};
posted @ 2021-06-04 00:17  Mrsdwang  阅读(41)  评论(0编辑  收藏  举报