题目:
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
进阶:你能尝试使用一趟扫描实现吗?
思路:快慢指针,快指针先走n步,然后一起到结尾,慢指针所指的即为倒数第n个节点。
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
//if(head == nullptr || head->next == nullptr) return head;
ListNode *vcur = new ListNode(0);
vcur->next = head;
ListNode*cur = vcur;//快指针
ListNode*pre = vcur;//慢指针
while(cur != nullptr && n--)//快指针先走n步
{
cur = cur->next;
}
cur = cur->next;//fast再提前走一步,因为需要让slow指向删除节点的上一个节点
while(cur != nullptr)
{
cur = cur->next;
pre = pre->next;
}
pre->next = pre->next->next;
return vcur->next;
}
};