题意:给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead=new ListNode(0); //定义虚拟头结点
ListNode* fast=dummyHead; //定义快指针
ListNode* slow=dummyHead; //慢指针
dummyHead->next=head;
while(n--)
{
fast=fast->next;
}
fast=fast->next; //先让快指针移动到第n+1个节点
while(fast!=NULL)
{
slow=slow->next;
fast=fast->next;
} //然后快慢指针同时移动,直到快指针移动到NULL处,此时慢指针移动到了要被删除结点的上一个结点。
ListNode* tmp=slow->next;
slow->next=slow->next->next;
delete tmp; //删除该结点,并连接下一个结点。
return dummyHead->next;
}
};
注意:
此题的重点是双指针法,定义快慢指针,题目要求删除倒数第n个结点,那么先让快指针移动到第n个结点,然后再让快慢指针一起移动,直到快指针移动到NULL,此时慢指针就移动到了倒数第n个结点。
又因为如果要删除一个结点,需要找到该结点的上一个结点,所以让快指针移动到第n个结点后,再往下移动一个结点,上述操作后,慢指针就会移动到被删除结点的上一个结点。
核心思想是,假设有10个数,我想找到倒数第二个数,那么先单独移动两次(正向),然后再一起移动(10-2)次,也就是移动八次,找到倒数第二个也就是正数第八个。
出自:代码随想录