从0开始准备华五复试

19. 删除链表的倒数第 N 个结点

链表这边的题都挺简单,就不赘述了,大多都是要用到虚拟头节点的

思路一(暴力):直接算出链表长度,找出要删除的前一个节点,删除

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值