【数据结构】--单链表力扣面试题①移除链表元素

news2024/11/23 21:29:49

  

题述:

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

 

思考:

为什么说要返回新的头结点,因为你删除的可能存在把原来的头结点删除的情况,这时就需要有新的头结点。这道题其实就是考察增删查改的变形

思路:

1、想删除值是val的那一个,那就要先找到它,这个节点值域是val的那一个节点可能有好几个。

2、因为涉及删除某一个节点,那就一定要使被删除节点的前一个节点的指针域指向被删除节点原指向的下一节点。所以重点是找到被删除节点的前驱节点法一就是找要被删除的前一个节点,判断他的next指向的下一节点的值域是不是val值。法二就是定义两个指针,一个指向前,一个指向后。我们推荐法二。因为如果省几个变量来节省内存是没必要的,并不是没有考虑空间复杂度的问题,而是因为多定义几个变量,空间复杂度还是o(1)。相对来说法二在实现中会更清晰一点。

 

注意点:头删和中间删除节点的情况要分别考虑

如果是头删就不需要prev指针,因为prev初始化是NULL,而你写成prev->next就对空指针访问了,这是非法访问内存的行为,是不被允许的!因此只需要考虑cur怎么动。

如果是中间删除需要prev指针了,因为其指针域也需要跟着改变。

 最后代码如下:

#include<stdio.h>
#include<stdlib.h>

struct ListNode
{
	int val;
	struct ListNode* next;
};
struct ListNode* removeElements(struct ListNode* head,int val)
{
	struct ListNode* prev = NULL, * cur = head;//遍历肯定要用cur去遍历
	while (cur)
	{
		if (cur->val == val)
		{	//1、头删,如果第一个节点数据就=val了
			if (cur == head)
			{
				head = cur->next;
				free(cur);
				cur = head;
				//这里头删是不用管prev的,因为后续不相等prev会=cur
			}
			//2、中间删除的情况处理
			else
			{
				prev->next = cur->next;
				free(cur);
				cur = prev->next;
			}
		}
		else
		{	//不相等则循环遍历往下走
			prev = cur;//不要写prev=prev->next,因为prev可能有是NULL的情况
			cur = cur->next;
		}
	}
	return head;
}
int main()
{
	struct ListNode* n1 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n2 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n3 = (struct ListNode*)malloc(sizeof(struct ListNode));
	struct ListNode* n4 = (struct ListNode*)malloc(sizeof(struct ListNode));
	n1->val = 7;
	n2->val = 7;
	n3->val = 7;
	n4->val = 7;
	n1->next = n2;
	n2->next = n3;
	n3->next = n4;
	n4->next = NULL;

	struct ListNode* head = removeElements(n1, 7);

	return 0;
}

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

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

相关文章

【机器学习】

说明&#xff1a;机器学习总结 0、数据集 1、贝叶斯分类器 &#xff08;一&#xff09;计算题 所有样本分为两类&#xff08;c &#xff09;&#xff1a;好瓜是、好瓜否 &#xff08;1&#xff09;计算先验概率&#xff1a;P(c ) &#xff08;2&#xff09;计算每个属性的条…

元宇宙:梦想能否照进现实?

开篇我想问大家一个问题&#xff1a;有没有想过人类的未来是什么样子&#xff1f; 就目前我们所能探索的世界&#xff0c;不论从空间上有跨越了几十亿光年的距离&#xff0c;还是从时间有上几万几亿年的演化&#xff0c;对于宇宙来说&#xff0c;我们人类实在是太过渺小、脆弱…

非暴力沟通模型

非暴力沟通模型 非暴力沟通的创始人是马歇尔.卢森堡&#xff0c;师从人本主义心理学之父卡尔.罗杰斯。《非暴力沟通》一书入选香港大学推荐的50本必读书籍之列。 模型介绍 非暴力沟通&#xff08;英文名称&#xff1a;NonviolentCommunication&#xff0c;简称NVC&#xff09;…

AMBER分子动力学模拟之结果分析(MMGB/PBSA)-- HIV蛋白酶-抑制剂复合物(4)

AMBER分子动力学模拟之结果分析(MMGB/PBSA)-- HIV蛋白酶-抑制剂复合物(4) 结合自由能计算 我们首先计算焙变&#xff0c;用到的是pbsa和gbsa方法。我们需要一下文件 三个top文件&#xff0c;pro.prmtop lig.prmtop com.prmtop&#xff1b;输入文件MM_GBSA.in&#xff1b;将要…

Nextcloud集成Onlyoffice实现协同办公。

Nextcloud 安装 LAMP&#xff08;LinuxApacheMySQLPHP&#xff09;方式。局域网单机模式。 安装环境&#xff1a; OS:ubuntu 22.04 Nextcloud&#xff1a;26 Apache&#xff1a;2.4.52 mysql&#xff1a;Server version: 8.0.33-0ubuntu0.22.04.1 (Ubuntu) php:PHP 8.1.2-1u…

(GCC)从零开始的ETH开发--STM32F407ZGTX

开发环境&#xff1a; windows10 软件&#xff1a; STM32CubeMX最新版本&#xff1a; gcc工具链&#xff1a; vscode 硬件&#xff1a; STM32F407ZGT6开发板&#xff0c;ETH原理图&#xff1a; ​ 根据硬件可知MAC和PHY之间的接口类型为RMII&#xff0c;且PHY使用的外…

【文老师软考数据库】(全)

目录 第一章 计算机系统基本知识 1.1 计算机系统 1.1.1 计算机硬件组成 1.1.2 中央处理单元 1.1.3 数据表示 1.1.4 校验码 1.2 计算机体系结构 1.2.1 体系结构分类 1.2.2 指令系统存 1.2.3 储系系统 1.2.4 输入/输出技术 1.2.5 总线结构 1.3 可靠性、性能、安全 …

Win10系统为什么又提示重装打印机驱动?

明明没干嘛&#xff0c;Win 10系统却提示需要重新安装打印机驱动程序。驱动人生就来说说Win10重新安装打印机驱动程序的原因及解决方法&#xff1a; 一般来说&#xff0c;如果用户更新了Win 10的操作系统&#xff0c;可能导致之前的打印机驱动错误或缺失&#xff0c;这时候就需…

运行KT001小车问题汇总

运行KT001小车问题汇总&#xff1a; Q: 在安装ros的时候&#xff0c;出现这样的问题是因为什么&#xff0c;是镜像文件里边缺少东西了吗&#xff0c;可以怎么解决&#xff1f; A: 导入的是vmk配置文件&#xff0c;缺少iso镜像文件&#xff0c;不影响ros的运行。 Q: 编辑好这个…

Android ANativeWindow 渲染画面

ANativeWindow 是 Android NDK&#xff08;Native Development Kit&#xff09;提供的一个C/C编程接口&#xff0c;用于与底层的图形系统进行交互&#xff0c;实现图像渲染和处理等功能。 使用方法&#xff1a;上层用 SurfaceView&#xff0c;传递 SurfaceView 的 Surface 给 n…

ChatGPT的插件能用了,每月 20 美元的实习生真香

文章目录 开启插件并使用其他补充缺点和不足总结 哈喽嗨&#xff01;你好&#xff0c;我是小雨青年&#xff0c;一名 追赶 AI 步伐的程序员。 自从上周 OpenAI 官宣了即将开放插件给 Plus 用户以来&#xff0c;这三天我就每天都会刷新ChatGPT 设置页面。 直到今天早上&#x…

SolVES模型应用(生态系统服务社会价值模型)

生态系统服务是人类从自然界中获得的直接或间接惠益&#xff0c;可分为供给服务、文化服务、调节服务和支持服务4类&#xff0c;对提升人类福祉具有重大意义&#xff0c;且被视为连接社会与生态系统的桥梁。自从启动千年生态系统评估项目&#xff08;Millennium Ecosystem Asse…

思迈特软件Smartbi荣登“2023未来银行科技服务商100强”

近日&#xff0c;中国科学院《互联网周刊》、eNet研究院联合发布了“2023未来银行科技服务商100强”企业榜单。思迈特软件以“商业智能BI产品”凭借在金融科技创新的独特优势及在银行数字化转型实践中的卓越成就荣耀上榜。 据了解&#xff0c;“未来银行科技服务商100强”榜单&…

SQL删除重复的记录(只保留一条)-窗口函数row_number()

文章目录 一、关于mysql表中数据重复二、聚合函数min(id)not in二、窗口函数row_number()四、补充&#xff1a;常见的窗口函数 一、关于mysql表中数据重复 关于删除mysql表中重复数据问题&#xff0c;本文中给到两种办法&#xff1a;聚合函数、窗口函数row_number()的方法。 (注…

ffmpeg-mpv配置详解04

mpv.conf 格式详解 存放位置 windows下 Roaming\mpv linux下在.conf/mpv # mpv conf ################################################################################ # 记忆播放[退出时记住播放状态、音量、播放速度、位置等] save-position-on-quit # 播放状态保存位置…

运行时栈帧结构与方法调用

1 运行时栈帧结构 Java虚拟机以方法作为最基本执行单元&#xff0c;“栈帧”则是用于支持虚拟机进行方法调用和方法执行背后的数据结构。栈帧存储了方法的局部变量表、操作数栈、动态连接和方法返回地址等信息。 1.1 局部变量表 局部变量表的容量以变量槽为最小单位。 Java…

强化学习:贝尔曼方程(Bellman Equation)

∗ ∗ 重点&#xff1a;状态值、贝尔曼方程 ∗ ∗ **重点&#xff1a;状态值、贝尔曼方程** ∗∗重点&#xff1a;状态值、贝尔曼方程∗∗ return评估策略 在前面概念介绍中&#xff0c;我们知道了可以用 return 来评估一个策略的好坏。如图&#xff0c;有三个不同的策略&…

线性插值提高DDS相位分辨率

DDS&#xff08;Direct Digital Synthesizer&#xff09;即直接数字频率合成技术&#xff0c;主要由正弦查找表与控制器组成&#xff0c;通过控制器给出的相位&#xff0c;在正弦查找表中查找对应的正余弦值并予以输出。通过多个 DDS 信号的组合&#xff0c;可以进一步构建出 A…

【源码解析】Disruptor框架的源码解析

Disruptor初始化 初始化Disruptor实例 //单线程模式&#xff0c;获取额外的性能 Disruptor<MessageModel> disruptor new Disruptor<>(factory, bufferSize, executor,ProducerType.SINGLE, new BlockingWaitStrategy());创建RingBuffer实例 Deprecatedpublic D…

Midjourney|文心一格prompt教程[Text Prompt(上篇)]:品牌log、App、徽章、插画、头像场景生成,各种风格选择:科技风、运动风

Midjourney|文心一格prompt教程[Text Prompt&#xff08;上篇&#xff09;]&#xff1a;品牌log、App、徽章、插画、头像场景生成&#xff0c;各种风格选择&#xff1a;科技风、运动风 1.撰写 Text Prompt 注意事项 Midjourney 跟 ChatGPT 在 prompt 的使用上有很多不一样的地…