目录
题目叙述
题解代码(双指针法)
思路:这道题是双指针法的经典应用,如果要删除倒数第n个结点,让 fast(快指针)先移动n步,然后让 fast 和 slow 同时移动,直到 fast 指向链表尾,这样 slow 就指向了倒数第n个结点,再将其删掉即可。
一些细节的处理:
1.建议使用虚拟头结点,让 fast 和 slow 的初值指向虚拟头结点,这样更加方便操作
2.fast 先走n+1步(这里非常关键),这样在同时移动后,last 就指向了第 n-1 个结点(即目标删除结点的上一个结点),这样更加方便删除操作。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0); //设置虚拟头结点
dummyHead->next = head;
ListNode* slow = dummyHead; //双指针法:fast 和 slow 初值均为虚拟头结点
ListNode* fast = dummyHead;
while(n--)
{
fast = fast->next;
}
fast = fast->next; //这里是非常关键的一步,即fast指向第n个结点时,再向前走一步,指向第n+1个结点。
while(fast != NULL)
{
slow = slow->next;
fast = fast->next;
}
slow->next = slow->next->next;
return dummyHead->next;
}
};
提交结果