链表这边的题都挺简单,就不赘述了,大多都是要用到虚拟头节点的
思路一(暴力):直接算出链表长度,找出要删除的前一个节点,删除
class Solution {
public:
ListNode* removeNthFromEnd(ListNode* head, int n) {
int sum = 0;
ListNode* vhead = new ListNode(0);
vhead->next = head;
ListNode* cur = vhead;
while (cur->next != nullptr) {
sum = sum + 1;
cur = cur->next;
}
cur = vhead;
int num = sum - n; // 要删去的数的前一位
while(num){
cur=cur->next;
num--;
}
cur->next=cur->next->next;
ListNode* result=vhead->next;
delete vhead;
return result;
}
};
这里要注意一下sum是不带虚拟节点的节点总数,num是相对于真正头节点的位置,比如num=0就是头节点,num=1就是头节点下一个节点;
思路二(快慢指针):已知要找倒数n个节点,那么要删掉他就要找倒数n+1的节点,所以设置两个指针一个是虚拟头节点一个是先走n+1的节点,逐个向后遍历,当fast节点指向到nullptr,那么也就找到了倒数第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 tmp;
return dummyHead->next;
}
};
1301

被折叠的 条评论
为什么被折叠?



