剑指 Offer 18. 删除链表的节点

news2024/9/24 1:23:31

一、题目描述

给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。

返回删除后的链表的头节点。

示例 1:

输入: head = [4,5,1,9], val = 5
输出: [4,1,9]
解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.

示例 2:

输入: head = [4,5,1,9], val = 1
输出: [4,5,9]
解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该链表应变为 4 -> 5 -> 9.

二、题目解析&思路分析

说明:

题目保证链表中节点的值互不相同
若使用 C 或 C++ 语言,你不需要 free 或 delete 被删除的节点

注意:这里题目描述说明 链表中的节点值不相同,因此只需要 遍历链表的每一个节点 找到该节点并且删除即可

例如:
在这里插入图片描述
现在有一个链表为 1 -> 2 ->3
现在需要删除的节点为 2
在这里插入图片描述
我们需要两个指针
指针1 指向 当前节点的前一个节点
指针2 指向当前节点

因为是单向链表我们需要保存当前遍历的每一个节点的前一个节点
删除的过程实际就是 将 当前节点 cur 的前一个节点和 当前节点下一个节点 连接起来

pre->next = cur->next;

在删除之前需要找到当前需要删除的节点,遍历查找

while(cur != nullptr && cur->val != val)
{
	pre = cur;
	cur = cur->next;
}

图示为:
在这里插入图片描述
若需要删除的值为头结点,那么只需要将头节点的下一个节点作为头结点返回即可

return head->next;

若需要删除的节点为最后一个节点,还是一样的思路,最后的一个节点的 next 为空
在这里插入图片描述
则还是一样的遍历删除方法,不用担心最后一个节点怎么办

pre->next = cur->next;
//cur->next 为nullptr 因此 pre->next = nullptr ,即删除了最后一个节点

三、代码实现

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* deleteNode(ListNode* head, int val) {
        if(head == NULL)
        {
            return head;
        }
        //需要删除的节点为头结点
        if(head->val == val)
        {
            return head->next;
        }
        //设置两个指针,分别指向 前节点与当前节点
        ListNode* listPreNode = head;
        ListNode* curNode = head->next;
        //找到需要删除的节点
        while(curNode != nullptr && curNode->val != val)
        {
            listPreNode = curNode;
            curNode = curNode->next;
        }
        if(curNode != nullptr)
        {
        	//将当前节点的前一个节点和当前节点的下一个节点链接起来即可
            listPreNode->next = curNode->next;
        }
        return head;
    }
};

运行效果:
在这里插入图片描述

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

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

相关文章

2022年最后一篇推文 | C语言编程十诫

正文大家好,我是bug菌~2022年最后一篇推文原本选择一篇年终总结会比较合适,然而坐在窗台,望着窗外思索了良久,与往年总结有点不同,这个时间节点有着他的特殊性,不出意外,明年会有非常多的变化、…

OpenShift 4 - 用 HyperShift 实现以“托管集群”方式部署运行 OpenShift 集群

《OpenShift / RHEL / DevSecOps / Ansible 汇总目录》 说明:本文已经在 OpenShift 4.11 ACM 2.6 AWS 环境中验证 文章目录用 HyperShift 实现 OpenShift 托管集群什么是 HyperShift 托管集群以及架构HyperShift 托管集群的价值成本优势部署优势管理优势在 RHACM …

【Kaggle】Global Wheat Detection

代码链接 实验目的 小麦来自世界各地。密度的小麦植株经常重叠;风会使得照片模糊;外观会因成熟度,颜色,基因型和头部方向而异。使用图像处理和目标检测完成小麦头的位置的标定。完成训练并现场验证后上传指定的输出文件进行验证…

大数据NiFi(三):NiFi关键特性

文章目录 NiFi关键特性 一、​​​​​​​​​​​​​​流管理

人工智能轨道交通行业周刊-第28期(2022.12.26-2023.1.1)

本期关键词:NOCC、车站闸机、雾闪、2022年度盘点、智慧园区 1 整理涉及公众号名单 1.1 行业类 RT轨道交通中关村轨道交通产业服务平台人民铁道世界轨道交通资讯网铁路信号技术交流北京铁路轨道交通网上榜铁路视点ITS World轨道交通联盟VSTR铁路与城市轨道交通Rai…

安全—01day

DNS 域名解析过程: 1.浏览器首先查询浏览器的缓存,因为浏览器会按照一定的频率缓存 DNS 记录 2.若浏览器无缓存,那么查询操作系统的 HOST 文件,查询是否有 DNS 记录。 3.若还没有命中域名,就请求本地域名服务器该服务器一般都会缓…

Qt音视频开发07-合并音视频文件

一、前言 之前已经把音视频分开存储了对应的文件,因为这个需求特别少,当然确实有部分用户是需要把音视频分开存储,但是毕竟是很少数,绝大部分的用户都是音视频合并到一个MP4文件,所以如果要合并到一个文件&#xff0c…

二进制与十六进制的相互转换;按位操作:与() 和 或(|)

目录 一、二进制转换十六进制 二、十六进制转换二进制 三、按位操作:与(&) 和 或(|) 1、按位与(&)操作 2、按位或(|)操作 得出结论:清0用与&am…

【金猿案例展】海尔集团——追光AI-AOI赋能PCBA缺陷检测

‍数之联案例本项目案例由数之联投递并参与“数据猿年度金猿策划活动——《2022大数据产业年度创新服务企业》榜单/奖项”评选。‍数据智能产业创新服务媒体——聚焦数智 改变商业AOI(Automated Optical Inspection缩写)的中文全称是自动光学检测。通过…

className 还能这么用,你学会了吗

抛出问题 className大家都用过吧,用它在react项目中设置样式。它的用法很简单,除了可以设置一个样式外,react中也可以使用className引入多个类样式。 这次在写项目的时候,碰到一个非常小但是当时却一直解决不了的问题。后面在复…

python基础语法25-进程理论

一、简介 服务器为了能够同时为多个客户端服务,则需要能够同时处理多个网络连接的方法。python提供了3个主要的方法来实现这个目的,multiprocessing、threading和异步I/O。 今天主要说一下进程multiprocessing。 multiprocessing是一个和threading(多线程)类似的库,这个多…

【MVC和三层架构】联系、区别以及简单实践

MVC架构模式MVC架构模式概述引入MVCMVC和三层架构之间的联系和区别三层架构与MVC联系和区别银行转账小项目实践MVC架构模式概述 MVC架构模式是软件架构中的一个架构模式。 M(Model:数据/业务) V(View:视图/展示&#x…

深入xJavaFxTool的插件开发模式

背景 时光华丽丽的来到了2023年,首先在这里祝大家新年快乐,希望大家在新的一年里都能心想事成,万事如意,最重要的是身体健康。过去的2022年里,大家一定都是收获满满。不论是技术的,家庭的,事业的…

【C++】map 与 set 的介绍与使用

目录 一、关联式容器 二、键值对 三、set 3.1 set 的介绍 3.2 set 的使用 3.3. set 的使用举例 四、map 4.1 map的介绍 3.2 map 的使用 4.3 map的使用举例 五、经典练习题 1.set的使用 2.map的使用 思路一(稳定排序): 思路二(priority_queue)&#x…

LabVIEW使用共享变量在两台计算机之间进行通信

LabVIEW使用共享变量在两台计算机之间进行通信 需要选择一台计算机作为服务器并发布变量,而另一台计算机作为客户端接收变量。然后,按照以下步骤设置服务器和客户端计算机。 服务器机器: 创建LabVIEW项目并通过右键单击“我的电脑”并选择…

opencv-python常用函数解析及参数介绍(六)——图像梯度

图像梯度前言Sobel算子算子的定义Sobelx效果演示Sobely效果演示完整轮廓直接计算复杂图片的轮廓Scharr算子与laplacian算子scharr算子的定义laplacian算子定义三种算子的效果对比结尾前言 前面的文章中我们介绍了用膨胀和腐蚀得到了图像轮廓,图像梯度也是一种可以得…

五年六次

今天是 2022 年的最后一天,可算等来了。讽刺的是,就在昨天,小号写了篇文章,啥主题就不说了,然后晚上文章被删了,账号居然也被封了。2022 全年虽然我写过很多文章都被和谐了,但是最后一天喜提封号…

二、Django

Django 提示:本文根据b站黑马python课整理 链接指引 > 黑马程序员python企业级开发项目-手把手从0到1开发《美多商城》 文章目录DjangoMVT图解项目准备1.创建项目2.创建应用3.更换python解释器4.安装应用5.本地化6.项目中匹配urls7.应用中匹配urls.py8.准备视图…

Tensorflow游乐场 在线可视化

playground.tensorflow.org Tensorflow游乐场 Tensorflow游乐场提供了一个在线可视化AI训练。A Neural Network Playgroundhttp://playground.tensorflow.org/ Tensorflow游乐场 是干啥的呢 给一堆点分出蓝色部分和橙色部分。也就是二分类。 它提供了4种数据来训练 每种数据…

致敬客户、致敬行业,知道创宇2022“宇”你并肩前行!

2022回首2022,一幅数字化、智能化升级的壮阔云图徐徐展开,顺势催生出安全技术的全新变革……这一年,中国网络安全企业代表——知道创宇,持续从技术创新、安全服务、行业融合等方面深入网络安全产业升级。我们坚守攻防博弈战场、纵…