手撕C语言题典——移除链表元素(单链表)

 

目录

 前言

一.思路

1)遍历原链表,找到值为 val 的节点并释放

2)创建新链表 

二.代码实现

1)大胆去try一下思路

2)竟然报错了?!    

3)完善之后的成品代码


搭配食用更佳哦~~

数据结构之单单单——链表-CSDN博客

数据结构之单链表的基本操作-CSDN博客

前面学了单链表的相关知识,我们来尝试做一下关于顺序表的经典算法题~

 前言

     移除链表元素是力扣上一道简单题,适合刚学过单链表的我们更好的理解链表相关知识~当然最好大家可以先去力扣上自己 try 一下~~

203. 移除链表元素 - 力扣(LeetCode)icon-default.png?t=N7T8https://leetcode.cn/problems/remove-linked-list-elements/

一.思路

      题干很简单,给你一个链表里面有一堆数据,再给你一个 val ,要找出链表里所有等于 val 的值并删除,生成不含 val 的新链表。

1)遍历原链表,找到值为 val 的节点并释放

     我们需要创建两个指针变量 head 和 pcur指向链表的头节点并且遍历链表,pcur 遍历到 val 值的时候停下,此时我们需要删除这个节点,但我们不能直接删除,和顺序表不同链表每个节点内置下一个节点的指针指向,如果直接删除链表就断了没法继续遍历,所以我们还需要再定义个变量 prev 在 pcur 前面,当 pcur 找到 val 时候,将 prev 指针指向下一个值不为 val 的节点,然后将 pcur 指向的值释放掉,所以我们还需要创建一个指向pcur 后面的变量 next,依次往后遍历数组,直到所有的 val 都被释放。

当 pcur 删除 val 之后继续遍历

2)创建新链表 

       顾名思义,我们在原链表的基础上,在新建一个空链表待用,依旧创建指针变量遍历原链表,找出值不为 val 的节点并存储到新链表里,遍历完成就可以得到所需要的链表了。

      我们需要给新链表创建两个头尾指针 newHead 和 newTail 来遍历新链表,注意此时新链表应该是空 NULL ,如下图所示:

     然后我们可以开始遍历原链表,需要注意的是,因为新链表为空所以既是头节点又是尾节点 ,当遍历一个节点到新链表之后,后面遍历的节点应尾插在尾节点的下一个节点插入,也就是 newTail  的 next 指针插入,此时链表有两个节点了,所以 newTail 应指向下一个节点的位置:

     当 pcur 遇到值为 val 的点的时候就跳过继续遍历下一个节点 。最终当 pcur 遍历完成指向为空的时候就得到新链表:

二.代码实现

1)大胆去try一下思路

     当我们理清思路的时候就可以开始尝试编写代码 :

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {//创建一个空链表ListNode* newHead, *newTail;newHead = newTail = NULL;//遍历原链表ListNode* pcur = head;while(pcur){//找出值不为val的节点,尾插到新链表里if(pcur->val != val){//链表为空if(newHead == NULL){newHead = newTail = pcur;}else{//链表不为空newTail->next = pcur;newTail = newTail->next;}}pcur = pcur->next;}return newHead;
}

2)竟然报错了?!    

当我们完成编写之后尝试第一次运行,我们会惊人的发现————解答出错了!

         

     输出的结果显示我们没有将本该被删除的 val 删除干净,为什么最后一个 val 的没删除呢?我们回头去看思路,我们注意一下在新链表的最后一个节点——也就是数值为5的那个节点,那里都存储着什么呢?一个是存储的 data = 5 ,还有一个指针——一个指针?这个指针是指向哪里的呢?因为这个节点是从原链表插过来的,那显而易见这个指针是指向下一个节点,也就是原链表最后一个值为 val 的节点,所以我们需要完善一下我们的代码,将最后一次 newTail 的 next 指针指为空,这样就可以避免让我们的新链表的尾节点指向原链表的最后一个节点了。

3)完善之后的成品代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {//创建一个空链表ListNode* newHead, *newTail;newHead = newTail = NULL;//遍历原链表ListNode* pcur = head;while(pcur){//找出值不为val的节点,尾插到新链表里if(pcur->val != val){//链表为空if(newHead == NULL){newHead = newTail = pcur;}else{//链表不为空newTail->next = pcur;newTail = newTail->next;}}pcur = pcur->next;}if(newTail)newTail->next = NULL;return newHead;
}

  这次就完美运行成功啦~~

 下一篇会接着将另一道有关链表的算法题~~

🎈🎈完结撒花🎈🎈 

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

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

相关文章

CellChat包文献介绍

Inference and analysis of cell-cell communication using CellChat - PubMed (nih.gov) 目录 在线数据 摘要 基础介绍 分析结果 1,概述 2,识别预测通路 3,连续的信号转导 4,预测空间共定位细胞群之间的关键信号转导事件…

Al Agent:开启智能化未来的关键角色,让机器更智能的为我们服务

文章目录 🚀Al Agent是什么📕Al Agent的工作原理与技术💪Al Agent应用领域🚀智能家居应用🌈医疗健康领域⭐金融服务行业🌂交通运输管理🎬教育培训应用 🔒Al Agent优势与挑战✊Al Age…

码题杯 世界警察 思想:双指针

https://www.matiji.net/exam/brushquestion/4/4446/16A92C42378232DEB56179D9C70DC45C 双指针 思路是这样的,首先r指针向右走,如果r指针遇到了和l指针一样的,那么l指针就,一直加到r指针的位置,此时a[l]a[r]&#xff0…

Flutter 首次亮相 Google Cloud Next 大会

作者 / Kelvin Boateng Flutter 团队在近期首次参加了 Google Cloud Next 大会,这意味着 Flutter 在开发社区中的影响力正在日益增长。 Google Cloud Next https://cloud.withgoogle.com/next 我们与 Google Cloud、Firebase、Very Good Ventures 和 Serverpod 的团…

双向链表(详解)

在单链表专题中我们提到链表的分类,其中提到了带头双向循环链表,今天小编将详细讲下双向链表。 话不多说,直接上货。 1.双向链表的结构 带头双向循环链表 注意 这几的“带头”跟前面我们说的“头节点”是两个概念,实际前面的在…

【大学物理】东北大学-马文蔚听课笔记

4.1刚体的定轴转动_哔哩哔哩_bilibili 此笔记为课堂学习笔记~ 4.1刚体的定轴转动 基本教学要求 什么时刚体呢? 研究刚体运动切口 平动:刚体中所有的点的运动轨迹都完全相同。 转动:分为¥定轴转动和非定轴转动 刚体转动的角速度…

【Unity 2D物理系统:触发】

在Unity的2D物理系统中,触发器(Trigger)是一种特殊的碰撞检测机制,它允许开发者检测到物体进入或离开特定区域时发生的动作,而不会影响物体的实际物理运动。触发器通常用于非物理交互的场景,如检测玩家进入…

vue3 antd-vue 超简单方式实现a-table跨页勾选

一、效果如下: 第一页勾选了2, 3, 4 翻到第三页勾选24, 25 回显,如比返回第一页的时候触发分页改变, 在映射中的第一页的数据给到a-table绑定的state.selectedRowKeys即可,如下方法 二、勾选思路…

Netty底层数据交互源码分析

文章目录 1. 前题回顾2. 主线流程源码分析3. Netty底层的零拷贝4. ByteBuf内存池设计 书接上文 1. 前题回顾 上一篇博客我们分析了Netty服务端启动的底层原理,主要就是将EventLoop里面的线程注册到了Select中,然后调用select方法监听客户端连接&#xf…

深入了解模拟和存根:提高单元测试质量的关键技术

一、引言 在进行单元测试时,我们经常会遇到对外部资源的依赖,如数据库、网络接口等。模拟(Mocking)和存根(Stubbing)是两种帮助我们模拟这些外部资源,使我们能够在隔离环境中测试单元的方法。在…

分布式任务调度框架xxl-job使用手册

官网地址和文档地址:https://www.xuxueli.com/xxl-job/ 一、快速入门 1.1 下载源码 https://github.com/xuxueli/xxl-job https://gitee.com/xuxueli0323/xxl-job 下载完成后有以下模块 1.2 初始化数据库 官方指定mysql8.0,但我是mysql5.7 执行/xxl…

PyQt6--Python桌面开发(6.QLineEdit单行文本框)

QLineEdit单行文本框 import sys import time from PyQt6.QtGui import QValidator,QIntValidator from PyQt6.QtWidgets import QApplication,QLabel,QLineEdit from PyQt6 import uicif __name__ __main__:appQApplication(sys.argv)uiuic.loadUi("./QLine单行文本框.u…

Qt 6.7功能介绍

Qt 6.7为我们所有喜欢在构建现代应用程序和用户体验时获得乐趣的人提供了许多大大小小的改进。一些新增内容作为技术预览发布,接下来我们就一起来看看吧: 将C20与Qt一起使用 对于许多编译器工具链来说,C20仍然是可选的和实验性的,…

台服dnf局域网搭建,学习用笔记

台服dnf局域网搭建 前置条件虚拟机初始化上传安装脚本以及其他文件至虚拟机密钥publickey.pem客户端配置如果IP地址填写有误,批量修改IP地址 前置条件 安装有vmvarecentos7.6镜像:https://mirrors.tuna.tsinghua.edu.cn/centos-vault/7.6.1810/isos/x86…

Python注意事项【自我维护版】

各位大佬好 ,这里是阿川的博客 , 祝您变得更强 个人主页:在线OJ的阿川 大佬的支持和鼓励,将是我成长路上最大的动力 阿川水平有限,如有错误,欢迎大佬指正 本篇博客在之前的博客上进行的维护 创建Python…

Day7 字符串和常用数据结构

文章目录 字符串和常用数据结构使用字符串使用列表生成式和生成器使用元组使用集合使用字典练习练习1:在屏幕上显示跑马灯文字。练习2:设计一个函数产生指定长度的验证码,验证码由大小写字母和数字构成。练习3:设计一个函数返回给…

linux下使用jexus部署aspnet站点

1.运行环境 Centos 7 安装dos2unix工具 yum install dos2unix 安装jexus curl https://jexus.org/release/x64/install.sh|sudo sh2.网站部署 2.1. 将windows下的网站发布包Msc_qingdao_admin.zip上传到linux中, 然后解压后放入/var/www(没有则创建)目录下 r…

福昕PDF阅读器取消手型工具鼠标点击翻页

前言: 本文介绍如何关闭福昕PDF阅读器取消手型工具鼠标点击翻页,因为这样真的很容易误触发PDF翻页,使用起来让人窝火。 引用: NA 正文: 新版的福昕PDF阅读器默认打开了“使用手型工具阅读文章”这个勾选项&#x…

超全MySQL锁机制介绍

前言 MySQL作为关系型数据库管理系统中的佼佼者,为了保证数据的一致性和完整性,在并发控制方面采用了锁机制。锁机制是数据库管理系统用于控制对共享资源的访问,避免多个事务同时修改同一数据造成的数据不一致问题。了解MySQL的锁机制对于数…

中信证券:量子产业蓄势待发,看好相关投资机会!

在1994年,数学家彼得肖尔(Peter Shor)首次提出了现在广为人知的肖尔算法,那时许多人认为量子计算机的概念遥不可及、纯属幻想。然而,到了2024年,全球正深入探讨量子科技在现实世界的应用,以及所…