代码随想录-第三日-移除链表元素

203. 移除链表元素 - 力扣(LeetCode)

    • ListNode* dummyHead = new ListNode(0);:创建一个虚拟头结点,其值为 0,这个节点的作用是为了方便处理头结点可能是需要删除的情况
    • dummyHead->next = head;:将虚拟头结点的指针指向原始链表的头结点
  1. 遍历链表并移除指定值的节点

    • 使用  初始化一个指针 ,从虚拟头结点开始遍历链表。ListNode* cur = dummyHead;cur
    • 在  循环中,检查当前节点的下一个节点是否为需要删除的节点:while
      • 如果 ,则删除该节点,更新  指针,并释放被删除节点的内存。cur->next->val == valcur->next
      • 否则,继续移动  指针到下一个节点。
  2. 更新头结点并释放虚拟头结点

    • head = dummyHead->next;:更新头结点为新的链表头(即跳过所有以  开始的节点)。val
    • delete dummyHead;:释放虚拟头结点的内存,避免内存泄漏。
  3. 返回结果

    • 最后返回处理后的链表头结果、

class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 创建一个虚拟头结点(dummy node),它的 next 指向原始链表的头结点
        // 这样可以方便处理头结点本身需要被删除的情况
        ListNode* dummyHead = new ListNode(0);
        dummyHead->next = head;

        // 使用当前指针 cur 从虚拟头结点开始遍历链表
        ListNode* cur = dummyHead;

        // 遍历链表,处理非头结点部分
        while (cur->next != NULL) {
            // 如果当前节点的下一个节点值为 val,则移除该节点
            if (cur->next->val == val) {
                ListNode* temp = cur->next;   // 保存要删除的节点
                cur->next = cur->next->next;  // 跳过要删除的节点
                delete temp;                  // 释放被删除节点的内存
            } else {
                cur = cur->next;              // 继续检查下一个节点
            }
        }

        // 更新头结点为新的链表头(跳过所有以 val 开始的节点)
        head = dummyHead->next;

        // 释放虚拟头结点的内存,避免内存泄漏
        delete dummyHead;

        // 返回处理后的链表头结点
        return head;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值