leetcode:203. 移除链表元素(有哨兵位的单链表和无哨兵位的单链表)

news2024/11/23 4:20:04

 一、题目

函数原型:

struct ListNode* removeElements(struct ListNode* head, int val)

二、思路 

本题有两种思路:

思路1

遍历单链表,如果遇到值为val的结点,则将该结点删除。

注意:当删除结点时,如果出现头结点为要删除的结点,那么prev->next就是对NULL进行解引用,所以这种情况需要先删除头结点,下一个结点作为新的头结点。

思路2

设置一个新的链表,遍历原有链表,如果遇到值不为val的结点,则将该结点尾插到新链表上,最终返回新链表。

思路2有两种实现方法,一种是带哨兵位的链表,另一种是不带哨兵位的链表

三、代码实现

思路1代码

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val) {
    if(head==NULL)
        return NULL;
    while(head&&head->val==val)//先删除符合删除条件的头结点
    {
        struct ListNode *tmp=head;
        head=head->next;
        free(tmp);
    }

    struct ListNode *prev=NULL;//定义前一指针,便于删除结点
    struct ListNode *cur=head;//定义遍历指针
    while(cur)
    {
        if(cur->val==val)//结点值等于val,删除结点
        {
            prev->next=cur->next;
            free(cur);
            cur=prev->next;
        }
        else//结点值不等于val,跳过结点
        {
            prev=cur;
            cur=cur->next;
        }
    }
    return head;
}

思路2代码(不带哨兵位)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode *cur=head;//遍历指针
    struct ListNode *newhead=NULL;//新的头结点
    struct ListNode *tail=newhead;//初始时尾指针指向新的头结点

    while(cur)//开始遍历原链表
    {
        if(cur->val!=val)//原链表结点值不等于val
        {
            if(tail==NULL)//初始时新链表为空,需要将要插入的结点作为新的头结点
            {
                newhead=tail=cur;
            }
            else//新链表不为空,进行尾插
            {
                tail->next=cur;
                tail=cur;
            }
            cur=cur->next;
        }
        else//销毁原链表中不需要的结点
        {
            struct ListNode *tmp=cur;
            cur=cur->next;
            free(tmp);
        }
        if(tail)//关键点,尾结点的指针域指向空
            tail->next=NULL;
    }
    return newhead;
}

思路2代码(带哨兵位)

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     struct ListNode *next;
 * };
 */
struct ListNode* removeElements(struct ListNode* head, int val) {
    struct ListNode *newhead=NULL;
    struct ListNode *tail=NULL;

    //哨兵位
    newhead=(struct ListNode *)malloc(sizeof(struct ListNode));
    tail=newhead;//初始时,尾指针指向哨兵位

    struct ListNode *cur=head;//遍历指针
    while(cur)//开始遍历原链表
    {
        if(cur->val!=val)//有哨兵位,直接进行尾插,无需判断头结点是否为空
        {
            tail->next=cur;
            tail=cur;
            cur=cur->next;
        }
        else//销毁原链表中不需要的结点
        {
            struct ListNode *tmp=cur;
            cur=cur->next;
            free(tmp);
        }
    }
    tail->next=NULL;//关键点,新链表尾结点的指针域指向空

    //销毁哨兵位
    struct ListNode *tmp=newhead;
    newhead=newhead->next;
    free(tmp);

    return newhead;//返回新链表的头结点
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1187466.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

《持续交付:发布可靠软件的系统方法》- 读书笔记(十二)

持续交付:发布可靠软件的系统方法(十二) 第 12 章 数据管理12.1 引言12.2 数据库脚本化12.3 增量式修改12.3.1 对数据库进行版本控制12.3.2 联合环境中的变更管理 12.4 数据库回滚和无停机发布12.4.1 保留数据的回滚12.4.2 将应用程序部署与数…

数字孪生与电力行业的完美融合

电力行业一直是现代社会不可或缺的一部分,而数字孪生技术正逐渐改变这一传统行业的面貌。数字孪生电力解决方案通过将物理世界与数字世界相结合,为电力行业带来了前所未有的机会和挑战。本文为大家介绍山海鲸电力行业系列解决方案,带大家了解…

Android修行手册-实现利用POI将图片插入到Excel中(文末送书)

点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…

MySQL的默认引擎为什么是InnoDB

MySQL支持InnoDB、MyISAM、MEMORY、CSV等多个存储引擎,那为什么选InnoDB作为默认引擎呢? 主要原因有几点: 事务 事务主要用于保持数据一致性,是一组操作的集合,要么全部成功,要么全部失败。InnoDB引擎提供…

STM32笔记—EXTI外部中断

一、简介 中断:在主程序运行过程中,出现了特定的中断触发条件(中断源),使得CPU暂停当前正在运行的程序,转而去处理中断程序,处理完成后又返回原来被暂停的位置继续运行; 中断优先级&…

自制编程语言基于c语言实验记录之五:虚拟机

1.创建类与堆栈框架 1 )对象调用实例方法,也就是向一个对象发送消息 时,运行时系统会在对象所属类的方法集合中查找方法。 2 )类调用类方法,也就是向一个类发送消息时,运行时系统会在类的 meta-class 的 方…

Sysmon 日志监控

系统监视器 (Sysmon) 是一个 Windows 日志记录加载项,它提供精细的日志记录功能并捕获默认情况下通常不记录的安全事件。它提供有关进程创建、网络连接、文件系统更改等的信息。分析 Sysmon 日志对于发现恶意活动和安全威胁至关重要。 在不断…

浅谈智能变电站自动化系统的应用与产品选型

安科瑞电气股份有限公司 上海嘉定 201801 摘要:现如今,智能变电站发展已经成为了电力系统发展过程中的内容,如何提高智能变电站的运行效率也成为电力系统发展的一个重要目标,为了能够更好地促进电力系统安全稳定运行,…

单片机程序无法下载?

原因一:电源问题 电源可能是导致STM32微控制器无法下载程序的一个常见原因。确保电源稳定对于正常运行和下载程序至关重要。以下是一些电源问题: 1. 电源电压不足:如果STM32微控制器没有足够的电压供应,它可能无法正常工作或下载程…

【AICFD案例教程】电子机箱风冷散热分析

AICFD是由天洑软件自主研发的通用智能热流体仿真软件,用于高效解决能源动力、船舶海洋、电子设备和车辆运载等领域复杂的流动和传热问题。软件涵盖了从建模、仿真到结果处理完整仿真分析流程,帮助工业企业建立设计、仿真和优化相结合的一体化流程&#x…

关于脑机接口实现的思考——再谈埃隆马斯克的脑机接口新动态

今天看到了埃隆马斯克的Neuralink的新动态,要招募志愿者进行试验,因此基于此前的文章,这里做一个新的探讨,第一篇文章在下面的链接,大家可以先过去看一下: 关于脑机接口该如何实现的考虑 埃隆马斯克的Neura…

评估APP网页小程序代码UI开发H5估价师怎么评估开发精确研发价格?

作为一名应用程序开发评估师,可能涉及到的主要任务是为特定的应用程序提供估算开发成本和所需时间预测。为了为一个应用程序更准确地评估价格,须遵循以下几个步骤: 问: 如何让一个App更好、更精确地评估出价格? 答: 以下是一个可…

MOSFET和IGBT栅极驱动器TLP250H(D4-TP1,F)电路的基本原理

TLP250H,TLP250H(D4-TP1,F)是SOP8封装中的光电耦合器,由GaA组成ℓ作为红外发光二极管(LED)光学耦合到集成的高增益、高速光电探测器IC芯片。它在高达125℃的温度下提供有保证的性能和规格. TLP250H具有内部法拉第屏蔽,…

浏览器插件实现国税网自动登录,以及解决浏览器记住密码会自动填充表单无法修改的问题

公司的做账系统,用户在系统里设置保存了国税网的账号密码以后,下次点击进入国税网,能够直接进入国税系统。 之前的解决方案是pupptteer模拟登录一遍拿到cookie等登录凭证后,保存到数据库,然后插件请求接口拿到cookie&…

柴油发电机负载测试的方法

柴油发电机负载测试是检查发电机组性能的重要环节,通过模拟实际工作负载,检测发电机组在不同负载下的运行情况,以确保其安全可靠地为用电设备提供电力。以下是柴油发电机负载测试的方法: 1. 准备工作:在进行负载测试之…

黔院长 | 黄帝内经:脏气法时论!

自然界有四季,四季更替影响万物的轮回。人体脏腑功能和气机运行与时间变化也有显著的影响。古人结合五脏之气,取四时五行的生克规律作为救治疾病的法则,对至今中医养生有重要参考作用! 五行,即木、火、土、金、水&…

C#Web文件上传的几种方式

1.第一种上传方式,基本通用于.net所有的框架 [HttpPost][Route("Common/uploadFile1")]public string uploads(){HttpContextBase context (HttpContextBase)Request.Properties["MS_HttpContext"];//获取传统contextHttpRequestBase request context.Re…

springbootMysql文华学院青年志愿者服务预约系统97973-计算机毕业设计项目选题推荐(附源码)

摘 要 随着社会的发展,社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 文华学院青年志愿者服务预约系统,主要的模块包括管理员:后台首页、轮播图、通知公告管理、资源管理(新闻资…

人工智能-卷积神经网络(LeNet)

为了能够应用softmax回归和多层感知机,我们首先将每个大小为\(28\times28\)的图像展平为一个784维的固定长度的一维向量,然后用全连接层对其进行处理。 而现在,我们已经掌握了卷积层的处理方法,我们可以在图像中保留空间结构。 同…

数据分析:小红书新兴场景洞察,捕捉消费新势力

导语 飞盘、骑行,露营…如今,户外运动日渐被人们所喜爱。近年来,继飞盘和骑行后,一项新潮的户外运动越来越受到年轻人的欢迎,路亚钓鱼,越来越多年轻人在入坑钓鱼。 图 | 小红书 图 | 小红书 什么是“路亚…