1、在dummyhead处定义两个指针,分别是fast和slow
2、让快指针先移动n步
3、然后让快慢指针一起移动
4、当快指针指到null空指针的时候,停止。此时慢指针在的位置正好是倒数第N个节点
5、但是呢要删除倒数第N个节点,需要操作点(slow)落在要删除点的前一个点
6、所以我们需要设定让快指针先移动n+1步
7、然后写代码
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;
}
};
如果直接这么写会报错,需要加上手动释放slow -> next 的代码
while (fast != NULL) {
fast = fast->next;
slow = slow->next;
}
ListNode* temp=slow->next; //定义temp
slow->next = slow->next->next;
delete temp;
return dummyHead->next;
}
};