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

(写给未来遗忘的自己)

 

class Solution {
public:
    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode dummy(0); // 使用虚拟头节点来处理头节点删除的情况
        dummy.next = head;
        ListNode* front_delete_listnode = &dummy;
        ListNode* last_listnode = &dummy;
        
        // 将last_listnode指针向前移动n+1步,以便使两个指针之间的差距为n
        for (int i = 0; i <= n; ++i) {
            last_listnode = last_listnode->next;
        }
        
        // 同时移动两个指针,直到last_listnode到达链表末尾
        while (last_listnode != nullptr) {
            front_delete_listnode = front_delete_listnode->next;
            last_listnode = last_listnode->next;
        }
        
        // 删除目标节点
        ListNode* delete_listnode = front_delete_listnode->next;
        front_delete_listnode->next = delete_listnode->next;
        delete delete_listnode;
        
        return dummy.next; // 返回新链表的头节点
    }
};

注意:(对于链表的处理要学会使用虚拟头,对于好多题都是简单的)

使用虚拟的头节点,如果头节点需要删除,那就和删除后面的没有区别。

删除倒数第n个,就是让一个快速节点和慢节点相距n,那么慢节点的下一个就是需要删除的节点。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值