用尾插的思想实现移除链表中的元素

目录

一、介绍尾插

1.链表为空

2.链表不为空

二、题目介绍

三、思路

四、代码

五、代码解析

1.

2.

3.

4.

5.

6.

六、注意点

1.

2.


一、介绍尾插

整体思路为

1.链表为空

void SLPushBack(SLTNode** pphead, SLTDataType x)
{SLTNode* newnode = BuyLTNode(x);    //每次尾插都要建立新的节点    //BuyLTNode(x)该函数用于得到新节点if (*pphead == NULL)	//没有节点,先赋值。	赋值不需要用到 tail !!!{*pphead = newnode;}}

需要注意的是:第一次尾插,只需要插入数据计科,并不需要建立tail指针、进行后移等操作

2.链表不为空

else	//此时才会用到 tail !
{SLTNode* tail = *pphead;while (tail->next != NULL)	//找尾{tail = tail->next;}tail->next = newnode;
}

此时需要:1.找尾 2.插入数据

二、题目介绍

203. 移除链表元素

已解答

简单

相关标签

相关企业

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

示例 1:

输入:head = [1,2,6,3,4,5,6], val = 6
输出:[1,2,3,4,5]

示例 2:

输入:head = [], val = 1
输出:[]

示例 3:

输入:head = [7,7,7,7], val = 7
输出:[]

三、思路

新建一个newhead指针和 tail 指针,将不是val的节点尾插到tail中。

四、代码

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode* removeElements(struct ListNode* head, int val) {struct ListNode* tail = NULL, *newhead = NULL;   //*newhead 不是newheadstruct ListNode* cur = head;while(cur){if(cur->val != val){if(newhead == NULL) //没有节点的时候,只需要插进去即可,并不需要指针后移!{newhead = tail = cur;   //tail从newcode开始}else    //应该在此处将整个链表串接{tail->next = cur;     //tail本质是指向cur的空间tail = tail->next;}cur = cur->next;    //为了防止tail和cur指向同一块空间。cur先往后走tail->next = NULL;        //tail的下一个节点置空。}else{struct ListNode* del = cur;    //要删除的元素暂存在del中cur = cur->next;free(del);   }}return newhead;}

五、代码解析

1.

struct ListNode* tail = NULL, *newhead = NULL;   //*newhead 不是newhead

   struct ListNode* cur = head;

新建指针,利用cur去遍历节点。

2.

            if(newhead == NULL) //没有节点的时候,只需要插进去即可,并不需要指针后移!

            {

                newhead = tail = cur;   //tail从newcode开始

            }

类比尾插没有节点的时候

3.

else    //应该在此处将整个链表串接

            {

                tail->next = cur;     //本质是让tail指向cur的空间。tail只是一个指针!

                tail = tail->next;

            }

类比有节点的尾插

4.

  cur = cur->next;    

  tail->next = NULL;             //为了防止出现野指针问题(heap-use-after-free 释放后的堆使用)

在while循环的第一个条件中,应用该语句链接整个链表,作为循环的控制语句。

5.

else

        {

            struct ListNode* del = cur;    //要删除的元素暂存在del中

            cur = cur->next;

            free(del);  

        }

当元素val等于的时候,需要借助一个del指针,删除需要删除的元素。

6.

return newhead;        返回新的节点

六、注意点

需要注意的是:

1.

cur = cur->next;   

tail->next = NULL;

①作为循环的控制语句,可以写在 子if 之外

②应该先让cur后移,再让tail的next指针置空。 若先置空tail->next,那么此时tail与cur是指向同一节点,此时cur的next也将置空!

③若链表的尾val也需要删除,此时free(tail)之后,仍存在一个指向不明的野指针!

④若子if 子else句同时用到的语句,且不存在先后问题(先后问题指一般无删除)

此时可以将共同的语句封装在外部。

⑤尾插是让tail不断赶上cur,让cur始终领先于或平齐于tail!tail是新链表的尾部。

2.

尾插的思想常用在对链表节点的重新排序。

需要用到 tail        newhead         cur(遍历节点)三个指针

其思想是:将单个链表中符合要求的节点放到两个链表中分析,但需要在原来的链表中实现

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

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

相关文章

蓝桥杯并查集|路径压缩|合并优化|按秩合并|合根植物(C++)

并查集 并查集是大量的树(单个节点也算是树)经过合并生成一系列家族森林的过程。 可以合并可以查询的集合的一种算法 可以查询哪个元素属于哪个集合 每个集合也就是每棵树都是由根节点确定,也可以理解为每个家族的族长就是根节点。 元素集合…

【开源鸿蒙】模拟运行OpenHarmony轻量系统QEMU RISC-V版

文章目录 一、准备工作1.1 编译输出目录简介 二、QEMU安装2.1 安装依赖2.2 获取源码2.3 编译安装2.4 问题解决 三、用QEMU运行OpenHarmony轻量系统3.1 qemu-run脚本简介3.2 qemu-run脚本参数3.3 qemu-run运行效果3.4 退出QEMU交互模式 四、问题解决五、参考链接 开源鸿蒙坚果派…

YOLOv8改进 | 图像去雾 | 门控可微分图像处理GDIP模块改善物体低照度检测检测(适用于图片不清晰等一切场景,全网独家首发)

一、本文介绍 本文给大家带来的改进机制是门控可微分图像处理GDIP模块,其可以理解为是一直图像增强领域的模块,其主要适用于雾天的一些去雾检测,当然了也适用于于一些图片模糊不清的场景,GDIP(Gated Differentiable Im…

论文阅读——EarthPT

EarthPT: a time series foundation model for Earth Observation 一个Earth Observation (EO)预训练的Transformer。EarthPT是一个7亿参数解码Transformer基础模型,以自回归自监督方式进行训练,并专门针对EO用例进行开发。我们证明了EarthPT是一个有效的…

谷歌(edge)浏览器过滤,只查看后端发送的请求

打开F12 调试工具 选择Network 这是我们会发现 什么图片 文件 接口的请求很多很多,我们只需要查看我们后端发送的请求是否成功就好了 正常情况我们需要的都是只看接口 先点击这里这个 过滤 我们只需要点击 Fetch/XHR 即可过滤掉其他请求信息的展示 这样烦恼的问题就…

海豚调度系列之:单机部署

海豚调度系列之:单机部署 一、前置准备工作二、启动 DolphinScheduler Standalone Server三、登录 DolphinScheduler四、启停服务五、配置数据库 Standalone 仅适用于 DolphinScheduler 的快速体验. 如果你是新手,想要体验 DolphinScheduler 的功能&…

windows下修改mysql的max_allowed_packet的值

1)C:\Program Files\MySQL\MySQL Server 5.7 在MySQL 的安装目录下添加my.ini文件,同时添加空的data文件 2)my.ini文件内容如下, [mysqld] port 3306 basedirC:\Program Files\MySQL\MySQL Server 5.7 datadirC:\Program Files\MySQL\MySQ…

【鸿蒙HarmonyOS开发笔记】自定义组件详解

自定义组件 除去系统预置的组件外,ArkTS 还支持自定义组件。使用自定义组件,可使代码的结构更加清晰,并且能提高代码的复用性。 我们开发的每个页面其实都可以视为自定义组件内置组件的结合 语法说明 自定义组件的语法如下图所示 各部分…

TCL管理Vivado工程

文章目录 TCL管理Vivado工程1. 项目目录2. 导出脚本文件3. 修改TCL脚本3.1 project.tcl3.2 bd.tcl 4. 工程恢复 TCL管理Vivado工程 工程结构 1. 项目目录 config: 配置文件、coe文件等。doc: 文档fpga: 最后恢复的fpga工程目录ip: ip文件mcs: bit流文件等,方便直接使用src: .…

npm包、全局数据共享、分包

使用 npm 包 小程序对 npm 的支持与限制 目前,小程序中已经支持使用 npm 安装第三方包,从而来提高小程序的开发效率。但是,在小程序中使用npm 包有如下 3 个限制: ① 不支持依赖于 Node.js 内置库的包 ② 不支持依赖于浏览器内置…

webgl canvas系列——快速加背景、抠图、加水印并下载图片

文章目录 ⭐前言⭐canvas绘制图片💖绘制csdn图片💖给png图片加背景💖cavans下载图片💖cavans上传图片并抠图💖cavans添加文字水印💖inscode 完整代码块 ⭐结束 ⭐前言 大家好,我是yma16&#x…

建设IAM/IDM统一身份管理,实现系统之间的单点登录(SSO)

企业实施身份管理的现状: 1.身份存储分散,不能统一供应诸多应用系统,企业用户信息常常存在于多个系统,如HR系统有一套用户信息,OA系统也有一套用户信息,身份存储不集中,不能统一地为诸多应用系…

AJAX概念和axios使用、URL、请求方法和数据提交、HTTP协议、接口、form-serialize插件

AJAX概念和axios使用 AJAX概念 AJAX就是使用XMLHttpRequest对象与服务器通信,它可以使用JSON、XML、HTML和text文本等格式发送和接收数据,AJAX最吸引人的就是它的异步特性,也就是说它可以在不重新刷新页面的情况下与服务器通信,…

Tomcat(二)

一、搭建个人博客 二、状态页 默认的管理页面被禁用,启用方法如下 修改conf/conf/tomcat-users.xml 2.1 开启状态页(本地访问) 2.2 开启允许远程登录状态页 2.3 host manager

【Spark编程基础】RDD 编程初级实践(附源代码)

目录 一、实验目的二、实验平台三、实验内容1.spark-shell 交互式编程2.编写独立应用程序实现数据去重3.编写独立应用程序实现求平均值问题 一、实验目的 1、熟悉 Spark 的 RDD 基本操作及键值对操作; 2、熟悉使用 RDD 编程解决实际具体问题的方法 二、实验平台 …

C语言字符串函数strstr、strtok和strerror

1.strstr函数 函数作用: 在字符串1中查找是否存在字符串2。 例子: "bbc"中找”bc“ 函数定义: const char * strstr ( const char * str1, const char * str2 ); str1字符串1的首字符的指针。str2字符串2的首字符的指针。const修…

ICANN备稿时debug遇到的问题

包问题 装包:先用fastai出现单击没有跳转的情况:安装pylance即可出现了用pip3 uninstall后pip3 list还有原来的numpy,然后用conda uninstall之后就行了。pip, pip3, conda这几个来回用。 精度问题 打印tensor数组自动保留后四位:…

git问题列表(一)(持续更新中~~~)

文章目录 问题1:如何在本地创建git仓库,并推送到远程仓库?问题2:如何创建本地分支,并基于其创建远程分支?问题3:报错“origin does not appear to be a git repository”是什么原因?…

如何在Ubuntu中查看编辑lvgl的demo和examples?

如何在Ubuntu中查看编辑lvgl的demo和examples? 如何在 Ubuntu系统中运行查看lvgl 1、拉取代码 在lvgl的github主页面有50多个仓库,找到lv_port_pc_eclipse这个仓库,点进去 拉取仓库代码和子仓库代码 仓库网址:https://github…

【php基础】输出、变量、

php基础补充 1. 输出2.和"的区别3.变量3.1变量的命名规则3.2 两个对象指向同一个值3.3 可变变量 4.变量的作用域5. 检测变量 1. 输出 echo: 输出 print: 输出,输出成功返回1 print_r(): 输出数组 var_dump(): 输出数据的详细信息,带有数据类型和数…