给你一个链表,删除链表的倒数第n个结点,并且返回链表的头结点。 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5]
核心思路:如果需要删除一个节点,则需要找到该节点的前一个节点。 由于题意要求的是倒数第n个节点,可以使用双指针法一次找到倒数n+1个节点。
双指针步骤:定义fast和slow两个指针指向虚拟头节点,fast首先走n + 1步后,fast和slow同时移动至fast指向链尾的NULL,此时slow指针指向倒数第n+1个节点。实现删除节点操作。
过程图为:
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
ListNode* dummyHead = new ListNode(0);
dummyHead->next = head;
ListNode* slow = dummyHead;
ListNode* fast = dummyHead;
while(n-- && fast != NULL) {
fast = fast->next;
}
fast = fast->next; // fast再提前走一步,因为需要让slow指向删除节点的上一个节点
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
slow->next = slow->next->next;
// ListNode *tmp = slow->next; C++释放内存的逻辑
// slow->next = tmp->next;
// delete nth;
return dummyHead->next;
}
};