【数据结构OJ题】移除链表元素

news2024/11/15 11:48:09

移除链表元素


原题链接:力扣 

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

 方法一:原地删除节点

思路:

 首先,定义两个指针:prve和cur。它们会在遍历链表的过程中分别指向当前节点的前一个节点和当前节点。初始情况下,prve指向NULL(因为当前节点是头结点),cur指向head。

然后,我们使用while循环遍历链表,直到cur指向NULL(也就是遍历完整个链表)。在每个节点处,我们判断当前节点(cur)的值是否等于val。如果是,我们就需要将该节点从链表中移除。

如果当前节点cur是头结点,那么我们需要特殊处理,因为头结点没有前一个节点。此时,我们修改head指向cur的下一个节点,然后释放cur所指向的内存空间,使得cur指向新的头结点(即head),继续遍历整个链表。

如果当前节点cur不是头结点,那么我们需要将cur从链表中移除。此时,我们将prve的next指针指向cur的下一个节点,然后释放cur所指向的内存空间,使得cur指向prve的下一个节点(也就是新的当前节点),继续遍历整个链表。

如果当前节点cur的值不等于val,我们就只需要更新prve和cur的指向,使得它们分别指向当前节点的前一个节点和当前节点的下一个节点,然后继续遍历整个链表。

具体过程图解:

 需要注意头节点的值是val的情况

代码:

struct ListNode* removeElements(struct ListNode* head, int val)
{
    //定义两个指针:prve和cur
    struct ListNode* prve = NULL;
    struct ListNode* cur = head;

    while (cur != NULL)
    {
        //判断当前节点(cur)的值是否等于val。如果是,我们就需要将该节点从链表中移除
        if (cur->val == val)
        {
            //如果当前节点cur是头结点,那么我们需要特殊处理
            if (cur == head)
            {
                head = cur->next;
                free(cur);
                cur = head;
            }
            else
            {
                prve->next = cur->next;
                free(cur);
                cur = prve->next;
            }
        }
        //如果当前节点cur的值不等于val,我们就只需要更新prve和cur的指向
        else
        {
            prve = cur;
            cur = cur->next;
        }
    }
    return head;
}

方法二:遍历链表,把不是val的节点拿出来进行尾插到新链表

下面有两种方式来实现;

不带哨兵卫头节点:

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* tail = NULL;
    struct ListNode* cur = head;
    head = NULL;
    while (cur)
    {
        if (cur->val != val)
        {
            if (tail == NULL)
            {
                head = tail = cur;
            }
            else
            {
                tail->next = cur;
                tail = cur;
            }
            cur = cur->next;
        }
        else
        {
            struct ListNode* del = cur;
            cur = cur->next;
            free(del);
        }
    }
    if (head)
    {
        tail->next = NULL;
    }
    return head;
}

带哨兵卫头节点:

struct ListNode* removeElements(struct ListNode* head, int val)
{
    struct ListNode* tail = NULL;
    struct ListNode* cur = head;
    head = tail = (struct ListNode*)malloc(sizeof(struct ListNode));
    head->next = NULL;
    while (cur)
    {
        if (cur->val != val)
        {
            tail->next = cur;
            tail = cur;
            cur = cur->next;
        }
        else
        {
            struct ListNode* del = cur;
            cur = cur->next;
            free(del);
        }
    }
    if (head)
    {
        tail->next = NULL;
    }          
    struct ListNode* del = head;
    head = head->next;
    free(del);
    return head;
}

带哨兵卫头节点和不带哨兵卫头节点的方法类似。

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

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

相关文章

minikube从入门到精通系列之一:部署minikube详细步骤

minikube从入门到精通系列之一:部署minikube详细步骤 一、认识Minikube二、Minikube核心知识点三、minikube官方地址四、minikube 启动五、minikube的配置需求六、Mac安装minikube七、CenotOS7上安装minikube八、启动集群九、与集群交互十、部署应用程序1.Service2.…

方向元件软件原理

三段方向电流保护的方向元件,可以由软压板选择正方向、反方向动作方式。这里仅以正方向为例来说明方向元件原理。 为了保证在各种相间短路故障时,方向元件能可靠而灵敏动作,微机保护的方向元件的“接线方式”(指软件的接线方式&am…

深度学习(25)——YOLO系列(4)

深度学习(25)——YOLO系列(4) 文章目录 深度学习(25)——YOLO系列(4)1. dataset准备(1)数据详解(2)dataset(3)…

Navicat连接Oracle报错:Oracle library is not loaded

Navicat连接Oracle报错:Oracle library is not loaded 用Navicat连接Oracle数据库时报错:Oracle library is not loaded 解决办法:::!! 这是oci.dll版本不对。因为Navicat是通过Oracle客户端…

11. requests.post()函数访问网页(小白入门)

11. requests.post()函数访问网页(小白入门) 文章目录 11. requests.post()函数访问网页(小白入门)1. 常用的http请求方法2. requests.post()语法3. 确定请求网址和请求方法4. 开发者工具中的Fetch/XHR表示什么5. requests.post()访问网页实操5.1 导入库,随机生成一…

Linux磁盘不足,解决办法

解决 一 查看 Linux大于1G的文件 命令 sudo find / -type f -size 1G -exec ls -lh {} \; 解决 二 清理docker的日志 Docker日志可能会占用大量的磁盘空间。可以使用以下命令清理Docker日志: sudo truncate -s 0 /var/lib/docker/containers/*/*json.log 解决…

5G无线帧结构与空口资源

时域资源分配< Time Domain Resource Allocation > 下表指示了传送SS/PBCH的第一个OFDM符号号码&#xff0c;基于TS38.213-4.1 cell search。 1. 子载波间隔 Numerology - Subcarrier Spacing 在载波间隔subcarrier spacing和时域的符号长度symbol length方面&#xff…

Kafka可视化平台EFAK搭建及使用

文章目录 1.EFAK可视化平台介绍2.搭建EFAK可视化平台2.1.安装JDK环境2.2.安装MySQL数据库2.3.下载EAK二进制安装包并部署2.4.配置EFAK连接Zookeeper集群2.5.调整Eagle启动文件中的变量信息2.6.启动EFAK可视化平台 3.使用EFAK可视化平台3.1.登陆EFAK可视化平台3.2.EFAK仪表盘展示…

智云通CRM:识破客户在谈判中的十大谎言

智云通CRM系统是一款专为企业打造的客户管理系统&#xff0c;可以有效帮助企业进行客户关系管理、数据分析和数字化转型。在销售过程中&#xff0c;客户谈判是不可避免的环节。然而&#xff0c;客户在谈判中经常会说一些谎言&#xff0c;以获取更有利的交易条件。对于销售人员来…

【Docker】Docker Desktop更换非C盘符(减轻占用率)

Win10中的Docker Desktop调整到其他盘符&#xff0c;由于新版本已经不让修改软连接了&#xff0c;只好另谋策略&#xff0c;最终还是改成功了。 出现问题 使用软连接修改 上面代码我们可以科幻的理解一下 幻想破灭 //TODO 用户点击执行安装 if(检查文件夹是否软连接){有则&a…

ThinkPHP6基础使用

ThinkPHP6基础使用 前言1.基础1.1 开启调试模式1.2测试运行1.3单应用模式和多应用模式区别1.4安装视图1.5模板渲染1.6模板赋值 总结 前言 这里的操作可能有点难懂&#xff0c;没关系的&#xff0c;只需要了解大致的框架构造就可以了 1.基础 1.1 开启调试模式 通过create-proje…

springboot+vue在线外卖点餐系统,附源码,数据库

今天要和大家聊的是基于springbootvue在线外卖点餐系统 源码下载地址&#xff1a; https://download.csdn.net/download/gdutxiaoxu/87651066 开发环境&#xff1a; 后端&#xff1a; 开发语言&#xff1a;Java 框架&#xff1a;springboot JDK版本&#xff1a;JDK1.8 …

酷开科技携手京东深入布局投影赛道

沉浸式观影&#xff0c;需要氛围感。大屏幕&#xff0c;大空间&#xff0c;才能让人有身临其境之感&#xff0c;居家生活想要更大的屏幕&#xff0c;除了大屏电视&#xff0c;就要数投影仪了。一部投影仪&#xff0c;再加上充足的空间&#xff0c; 就能够投满整面墙&#xff0c…

第44步 深度学习图像识别:ResNet50建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 &#xff08;1&#xff09;ResNet50 ResNet50是一种深度学习模型&#xff0c;由微软研究院的研究人员在2015年提出。"ResNet"的全称是"Residual Network"&#xff0c;意为"残差网络"&#xff0c;"…

WPS 智能办公体验官公测-附申请链接

&#x1f951; Welcome to Aedream同学 s blog! &#x1f951; 文章目录 WPS 智能办公体验官官网步骤1:填写申请表单&#xff1a;步骤2:获取兑换码&#xff1a; AI办公时代 WPS大家都了解就不再多介绍了&#xff0c;个人还是很期待的&#xff0c;可以申请体验一波。 WPS 智能…

“京津冀现代商贸物流金融创新实践基地”揭牌成立

来源 | 廊坊银行 在6月17日举办的京津冀现代商贸物流金融创新发展论坛上&#xff0c;“京津冀现代商贸物流金融创新实践基地”正式授牌。据介绍&#xff0c;这是目前京津冀区域内首个商贸物流金融创新实践基地。中国物流与采购联合会会长何黎明、廊坊市现代商贸物流领导小组办…

G2. Teleporters (Hard Version)(二分)

Problem - 1791G2 - Codeforces 这道题给定一个数轴上的点 0,1,...,n1&#xff0c;其中每个点 i (1 ≤ i ≤ n) 都有一个传送门。在第 i 个点&#xff0c;你可以进行以下操作&#xff1a; 向左移动一格&#xff1a;花费 1 个金币。 向右移动一格&#xff1a;花费 1 个金币。 使…

同时配置cuda11.0和11.1环境

同时配置cuda11.0和11.1环境 背景思路流程电脑环境确认确认位置安装新CUDA环境1、执行cuda.exe2. 配置环境变量 安装cudnn 背景 【在电脑上安装多个版本的cuda】&#xff1a;电脑已经安装好了cuda11.0&#xff0c;由于mmdetection版本不匹配&#xff0c;所以想要再安装cuda11.…

【Java】 Java 中函数式接口的使用

本文仅供学习参考&#xff01; 相关教程地址&#xff1a; https://www.runoob.com/java/java8-functional-interfaces.html https://www.cnblogs.com/dgwblog/p/11739500.html https://www.developer.com/java/java-functional-interfaces/ 接口是定义一组方法及其签名的契约。…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第五章 密码学基础上)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、密码学概述1、密码学的历史2、密码学的基本术语 二、密码学基本概念1、基本概念2、密码系统的安全性3、密码体制的分类4、密码体制的攻击 三、古典密码学四、对称密码算法…