删除链表的倒数第n个节点

题目

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。

示例 1:

输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:

输入:head = [1], n = 1
输出:[]
示例 3:

输入:head = [1,2], n = 1
输出:[1]

提示:

链表中结点的数目为 sz
1 <= sz <= 30
0 <= Node.val <= 100
1 <= n <= sz

思路

倒数n个节点,可以这样子干,定义一个滑动窗口,头fast前进到第n个节点的时候滑动窗口形成,也就是加上slow = virhead,之后slow和fast一起前进,当fast到最后一个元素的时候,slow的位置刚好为要删除节点的上一个节点,再最后进行删除操作,然后返回virhead->next。(但是要注意什么时候该加上slow,什么时候slow开始和fast一起前进)

代码

#include<iostream>
#include<string.h>
using namespace std;

struct ListNode{
    int val;
    ListNode* next;
    ListNode(int val):val(val),next(nullptr){}
    ListNode(int val,ListNode* next):val(val),next(next){}
};
class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode* virhead = new ListNode(-1);
        virhead->next = head;
        ListNode* fast = virhead;
        ListNode* slow = NULL;
        while (fast->next != NULL){
            fast=fast->next;//注意这些操作的先后顺序是有讲究的,刚开始的时候就是放错了顺序导致了错误
            n--;
            if(slow!=NULL){
                slow = slow->next;
            }
            if(n==0){
                slow = virhead;
            }
        }
        ListNode* jk = slow->next;//出现段错误,表示内存泄露了
        ListNode* gh = slow->next->next;
        slow->next = gh;
        delete jk;
        return virhead->next;
    }
};
int main(int argc, char const *argv[])
{
   
    ListNode* head = new ListNode(1);
    Solution so;
    so.removeNthFromEnd(head,1);
    system("pause");
    return 0;
}

posted @ 2023-03-02 15:02  铜锣湾陈昊男  阅读(10)  评论(0)    收藏  举报