一.题目
给你一个链表,删除链表的倒数第 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]
二.思路
采用双指针将倒数问题转换为正数,比如要删除第n个节点,可以先让fast指针移动n步,之后fast和solw指针同时移动,直到fast指向链表末尾,及fast==NULL,之后删除slow指向的节点。
注意事项:
1.采用虚拟头节点可以方便处理删除头节点的问题,避免了将头节点作为特殊情况处理。
2.删除第n个节点,要移动n+1步,因为删除第n个节点,需要利用其前一个节点。
三.代码
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode*dummyhead=new ListNode();
dummyhead->next=head;
ListNode *temp1=dummyhead;
ListNode *temp2=dummyhead;
n+=1;//删除节点需要该节点的上一个节点
while(n--&&temp1!=NULL)
{
temp1=temp1->next;
}
while(temp1!=NULL)
{
temp1=temp1->next;
temp2=temp2->next;
}
ListNode *temp3=temp2->next;
temp2->next=temp2->next->next;
delete temp3;
temp3=NULL;
return dummyhead->next;
}
};