删除链表的倒数第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;
}

浙公网安备 33010602011771号