手撕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.hqwc.cn/news/685879.html

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

相关文章

双向链表(详解)

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

【机器学习与实现】线性回归分析

目录 一、相关和回归的概念(一)变量间的关系(二)Pearson(皮尔逊)相关系数 二、线性回归的概念和方程(一)回归分析概述(二)线性回归方程 三、线性回归模型的损…

vue开发网站—①调用$notify弹窗、②$notify弹窗层级问题、③js判断两个数组是否相同等。

一、vue中如何使用vant的 $notify(展示通知) 在Vue中使用Vant组件库的$notify方法来展示通知,首先确保正确安装了Vant并在项目中引入了Notify组件。 1.安装vant npm install vant --save# 或者使用yarn yarn add vant2.引入:在ma…

springboot整合redis多数据源(附带RedisUtil)

单数据源RedisUtil(静态) 单数据源RedisUtil,我这里implements ApplicationContextAware在setApplicationContext注入redisTemplate,工具类可以直接类RedisUtil.StringOps.get()使用 package com.vehicle.manager.core.util;import com.alibaba.fastjson.JSON; import lombok.e…

信息系统项目管理基础

目录 一、项目管理概论 1、定义 2、项目管理的十二原则 3、SMART原则 4、项目经理 5、项目的生命周期 二、项目立项管理 1、项目启动过程 三、项目整合管理 1、管理基础 2、项目整合管理过程 ①制定项目章程 ②制定项目管理计划 ③指导与管理项目工作 ④管理项目…

stm32之hal库spi驱动封装(实现阻塞,中断,dma三种方式)

前言 配置功能参考rt-thread驱动代码将中断配置和dma配置单独分开管理 代码 中断管理 头文件 /** Copyright (c) 2024-2024,shchl** SPDX-License-Identifier: Apache-2.0** Change Logs:* Date Author Notes* 2024-5-3 shchl first version*/#ifnd…

Python图形复刻——绘制母亲节花束

各位小伙伴,好久不见,今天学习用Python绘制花束。 有一种爱,不求回报,有一种情,无私奉献,这就是母爱。祝天下妈妈节日快乐,幸福永远! 图形展示: 代码展示: …

06.线程同步

互斥锁(互斥量) 描述 一个进程下的线程是共享资源的,通信便利的同时也造成了许多麻烦,线程程和线程之间如果同时访问一块资源就会出错,所以要引入一个互斥变量给它加锁,让它去协同不同线程程之间的访问&am…

【软件测试】3.开发模型

目录 1.常见的开发模型 1.1瀑布模型 1.2螺旋模型 1.3增量模型和迭代模型 1.4敏捷模型 1.4.1特点: 1.5Scrum模型(三个角色和五个重要会议) 1.5.1三个角色: 1.5.2Scrum工作流程(五个会议) 1.6测试模…

Unreal Engine(虚幻引擎)的版本特点

Unreal Engine(虚幻引擎)是Epic Games开发的游戏引擎,广泛应用于游戏开发、影视制作、建筑设计、虚拟现实等领域。Unreal Engine版本指的是该引擎的发布版本,不同版本之间在功能、性能和稳定性等方面存在差异。北京木奇移动技术有…

【JavaScript】内置对象 - 数组对象 ① ( 数组简介 | 数组创建 | 数组类型检测 )

文章目录 一、数组对象1、数组简介2、数组创建3、数组检测 - Array.isArray() 方法4、数组检测 - instanceof 运算符 Array 数组对象参考文档 : https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array 一、数组对象 1、数组简介 在 JavaScr…

【vulhub靶场】Apache 中间件漏洞复现

【vulhub靶场】Apache 中间件漏洞复现 一、Apache HTTPD 换行解析漏洞(CVE-2017-15715)1. 漏洞详情2. 影响版本3. 漏洞复现 二、Apache多后缀解析漏洞(apache_parsing_vulnerability)1. 漏洞详情2. 漏洞复现 三、Apache HTTP Serv…