- 删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
思路1:双指针
这种链表的第几个结点问题,一般采用双指针的方法来解决。
1.为了删除方便,创建一个哑结点,作为新的头结点,后指针指向哑结点,前指针指向原来的头结点
2.先将前指针移动n步,这样,前指针走到末尾时,后指针刚好指向倒数第n个结点的前一个结点。
3.前后指针一起移动,直到后指针指向链表末尾
4.删除后指针后一个结点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* a =new ListNode(0,head);//哑结点
ListNode* second=a;//前指针
ListNode* first=head;//后指针
for(int i = 0; i< n ;++i)
{
first=first->next;
}
//前指针移动n步
while(first)
{
first=first->next;
second=second->next;
}
//前后指针一起移动
second->next=second->next->next;//删除目标结点
ListNode* ans = a->next;
delete a;//删除哑结点
return ans;
}
};
思路2:递归
看评论里的,不得不说真妙
class Solution {
int cur=0;
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
if(!head) return NULL;
head->next=removeNthFromEnd(head->next,n);
return ++cur==n ? head->next:head;
//这句的简单写法
//cur++;
//if(cur==n) return head->next;
//return head;
}
};