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

文章目录

203.移除链表元素

题目描述

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。
示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6

输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1

输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7

输出:[]

提示:

  • 列表中的节点数目在范围 [0, 104] 内
  • 1 <= Node.val <= 50
  • 0 <= val <= 50

原链表删除元素

cpp 复制代码
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
        // 删除头结点
        while(head!=NULL&&head->val==val)//注意这里不是if ,因为可能需要删除的头结点不止一个
        {
           //使用 tmp 指针的好处是,在修改链表结构之前,它保存了对被删除节点的引用,这样我们就可以先调整链表的指针,然后安全地释放被删除节点的内存,避免内存泄漏。
           ListNode* tmp=head;
           head=head->next;
           delete tmp; 
        }

        // 删除非头结点
        ListNode* cur=head;
        //cur作用:cur起链表中遍历作用, 提供了一种连接链表的 "前" 和 "后" 的方法,让我们在不丢失链表其他部分的情况下删除特定的节点。
        //如果不使用cur,使用head,在head=head->next中你会发现把头节点删了
        while(cur!=NULL&&cur->next!=NULL)
        {
            if(cur->next->val==val)
            {
                ListNode* tmp=cur->next;
                cur->next=cur->next->next;
                delete tmp;
            }
            else cur=cur->next;
        }
        return head;
    }
};

虚拟头节点

cpp 复制代码
class Solution {
public:
    ListNode* removeElements(ListNode* head, int val) {
    	//在C++中,new 关键字的作用是动态分配内存。它从自由存储区(通常是堆,与栈相对)上为对象或数组分配内存,并返回一个指向该内存的指针。当你创建一个对象时,new 会调用对象的构造函数来初始化这块内存。
    	//内存分配:new ListNode(0) 请求系统从堆中分配足够存储一个 ListNode 对象的内存。
    	//对象构造:在为 ListNode 对象分配内存后,new 调用 ListNode 类的构造函数,使用提供的参数 0 来初始化对象。这意味着创建的 ListNode 对象的值将被设置为 0。
    	//返回指针:操作完成后,new 返回指向新分配和构造的 ListNode 对象的指针。这个指针然后被存储在变量 dummyhead 中。
        ListNode* dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* cur=dummyhead;
        while(cur!=NULL&&cur->next!=NULL)
        {
            if(cur->next->val==val)
            {
                ListNode* tmp=cur->next;
                cur->next=cur->next->next;
                delete tmp;
            }
            else cur=cur->next;
        }
        //这里返回的是虚拟头节点的下一个,而不是原来的头节点,因为原来的头节点可能被删了
        return dummyhead->next;
        //如果想要使用内存更加小,可以把虚拟头节点删了
        /*head=dummyhead->next;
        delete dummyhead;
        return head;*/
    }
};
相关推荐
SylviaW083 分钟前
python-leetcode 63.搜索二维矩阵
python·leetcode·矩阵
小卡皮巴拉8 分钟前
【力扣刷题实战】矩阵区域和
开发语言·c++·算法·leetcode·前缀和·矩阵
Pacify_The_North20 分钟前
【C++进阶三】vector深度剖析(迭代器失效和深浅拷贝)
开发语言·c++·windows·visualstudio
神里流~霜灭27 分钟前
蓝桥备赛指南(12)· 省赛(构造or枚举)
c语言·数据结构·c++·算法·枚举·蓝桥·构造
扫地的小何尚32 分钟前
NVIDIA工业设施数字孪生中的机器人模拟
android·java·c++·链表·语言模型·机器人·gpu
Zfox_34 分钟前
【C++项目】从零实现RPC框架「四」:业务层实现与项目使用
linux·开发语言·c++·rpc·项目
我想吃余37 分钟前
【C++篇】类与对象(上篇):从面向过程到面向对象的跨越
开发语言·c++
想睡hhh1 小时前
c++概念——入门基础概念
开发语言·c++
愚润求学1 小时前
【C++】vector的模拟实现
开发语言·c++·stl·语法
又过一个秋1 小时前
【sylar-webserver】7 定时器模块
linux·c++