单链表OJ题:移除链表元素(力扣)

目录

解法一:带头节点的新链表

解法二:不带头节点的新指向关系链表

总结


这是一道简单的力扣题目,关于解法的话,这里提供了二种思路,重点解释前两种还有一种思路好想,但是时间复杂度为O(n^2) ,提供的这两种时间复杂度为O(n),所以,我们以解题的代码量少,时间最优选择提供的这两种的解法

解法一:带头节点的新链表

这里只所以要带头节点,是因为带头节点可以给我们的解题上带来一些方便,在总结里面我们会重点比较带头节点和不带头节点解题上的区别

带头节点时,我们需要申请一个头节点,头节点的作用是用来占位(最后我们需要返回的是头节点的下一个节点地址),然后,我们遍历原链表,将原链表中节点的val值不为6的节点依次尾插在头节点的后面,最后,将最后的节点的next域置为NULL,我们得到一个新链表,返回头节点的下一个节点的地址,就是我们的答案。 

/*** 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* newNodeHead = (ListNode*)malloc(sizeof(ListNode));  //创建新链表的头节点newNodeHead->val = 0, newNodeHead->next = NULL;ListNode* newHead,*newTail;newHeadHead = newTail = newNode;     //初始化头指针和尾指针指向新链表的第一个节点//遍历原链表while(head){if(head->val != val){newTail->next = head;       //找到符合的值就插入到新链表的后面newTail = newTail->next;     //尾指针后移}head = head->next;      //不断后移指针} newTail->next = NULL;return newHeadHead->next;
}

我们举个例子,一开始,我们申请一头节点头节点的next域为NULL,我们要遍历原链表,将原链表中val值不为6的节点连接在newNodeHead后面 

修改完之后,节点的关系如图所示,原链表的节点指向被改变,尾节点的next域为NULL

这里需要注意:

1、尾指针始终要指向头节点后面要尾插的节点,也就是指向新链表的最后一个节点,当原链表查找结束的时候,要把尾指针的next置为NULL。一方面,防止当新链表中的最后一个节点是原链表的中间节点的时候,尾节点的next域不为NULL便会访问原链表中的这个中间节点后面的节点,也就会访问到其中的节点中不满足val条件的节点,另一方面,当第一个节点为NULL时,我们需要返回的是头节点的next域,所以这时要把该指针置为NULL) 

2、返回的是头节点的next指针,也就是头节点的下一个节点。

解法二:不带头节点的新指向关系链表

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
typedef struct ListNode  ListNode;
class Solution {
public:ListNode* removeElements(ListNode* head, int val) {if(head==NULL){return NULL;}ListNode * newHead,*newTail;   //创建新的链表newHead = newTail = NULL;//遍历链表ListNode * pcur = head;   //创建指向头节点的指针,便于遍历while(pcur){if(pcur->val != val){//找值不为val的节点,将这个节点添加到新链表中if(newHead == NULL){newHead = newTail = pcur;}else{newTail->next = pcur;newTail = newTail->next;    //尾指针向后移动}}pcur = pcur->next;    //pucr 往后遍历}if(newTail != NULL){newTail->next = NULL;}return newHead;}
};

从这里,可以看出,我们不带头节点的解法代码量增加了许多,总体思路分为下面的几步:

1、我们创建头指针指向新链表的第一个节点和尾指针指向新链表的最后一个节点

2、我们遍历原链表,查找节点值不为val的节点,然后,我们把节点尾插到新链表中。

3、插入的时候分两种情况,一种是头指针为NULL,此时要将头指针和尾指针都指向这个节点当新链表的第一个节点

4、当头指针不为NULL时要把节点插入到尾指针指向节点的后面 

5、原链表查找结束后,将尾节点的next域置为NULL.(注意,此时的尾指针可能没有指向原链表的节点,也就是此时newTail尾NULL,这时我们不需要将尾节点的next域置为NULL,不然会报错)

总结

这里,因为解法一有头节点的存在,我们在实现尾插的时候,就不需要考虑插入第一个节点时头指针和尾指针指向的两种情况,直接在头节点后面插入满足条件的节点就行。第二个方便的地方就是,我们在查找完成后,对尾指针指向的节点置为NULL的时候当有头节点的时候,尾指针可以直接置为NULL,因为此次的尾指针指向的是头节点,但是,当尾指针指向的节点不存在的时候,这个时候就不能执行将newTail置为NULL的操作了

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

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

相关文章

一站式学习 Shell 脚本语法与编程技巧,踏出自动化的第一步

文章目录 1. 初识 Shell 解释器1.1 Shell 类型1.2 Shell 的父子关系 2. 编写第一个 Shell 脚本3. Shell 脚本语法3.1 脚本格式3.2 注释3.2.1 单行注释3.2.2 多行注释 3.3 Shell 变量3.3.1 系统预定义变量(环境变量)printenv 查看所有环境变量set 查看所有…

SMT 生产可视化:提升电子组装流程效率

通过图扑 HT 对表面贴装技术(SMT)生产线的实时数据采集与可视化分析,实现对产品质量、产能利用率和流程优化的有效监控,助力生产效率最大化与质量提升。

听见文本的魅力:AI 与未来的语音交互

AI 与未来的语音交互 引言什么是文本转语音(TTS)?当前 TTS 技术现状国内海外文本转语音能力调研文本转语音能力说明多情感风格SSML语音合成标记语言 未来趋势 引言 随着人工智能(AI)技术的迅猛发展,文本转…

OpenCV视觉分析之运动分析(4)背景减除类:BackgroundSubtractorKNN的一系列set函数的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 BackgroundSubtractorKNN类有一系列的set函数,下面我们一一列举他们的名字和用法。 一系列set函数 函数setDetectShadows() setDe…

笔记整理—linux驱动开发部分(1)驱动梗概

驱动可以分为广义上的和狭义上的驱动。广义上的驱动是用于操作硬件的代码,而狭义上的驱动为基于内核系统之上让硬件去被操作的逻辑方法。 linux体系架构: 1.分层思想 :在OS中间还会有许多层。 : 2.驱动的上面是系统调用(API&…

JavaScript网页设计案例教程:从零开始构建一个响应式网页

JavaScript网页设计案例教程:从零开始构建一个响应式网页 前言 在当今互联网时代,网页设计已成为一项重要技能。JavaScript作为网页开发的核心技术之一,能够让网页变得更加生动和交互。本文将带您通过一个实际案例,逐步学习如何…

万字图文实战:从0到1构建 UniApp + Vue3 + TypeScript 移动端跨平台开源脚手架

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot 🍃 vue-uniapp-template 🌺 仓库主页: Gitee 💫 Github &#x1f…

【C语言】控制台学生成绩管理系统

文章目录 C语言编程:学生成绩管理系统一、程序概述二、代码实现三、程序解释 C语言编程:学生成绩管理系统 在这篇文章中,我们将一起探讨如何使用C语言来创建一个简单的学生成绩管理系统。这个系统将允许用户输入学生数量、学号和成绩&#x…

钉钉录播抓取视频

爬取钉钉视频 免责声明 此脚本仅供学习参考,切勿违法使用下载他人资源进行售卖,本人不但任何责任! 仓库地址: GItee 源码仓库 执行顺序 poxyM3u8开启代理getM3u8url用于获取m3u8文件userAgent随机请求头downVideo|downVideoThreadTqdm单线程下载和…

水轮发电机油压自动化控制系统解决方案介绍

在现代水电工程中,水轮机组油压自动化控制系统,不仅直接关系到水轮发电机组的安全稳定运行,还影响着整个水电站的生产效率和经济效益。 一、系统概述 国科JSF油压自动控制系统,适用于水轮发电机组调速器油压及主阀(蝶…

Golang | Leetcode Golang题解之第503题下一个更大元素II

题目&#xff1a; 题解&#xff1a; func nextGreaterElements(nums []int) []int {n : len(nums)ans : make([]int, n)for i : range ans {ans[i] -1}stack : []int{}for i : 0; i < n*2-1; i {for len(stack) > 0 && nums[stack[len(stack)-1]] < nums[i%…

01 springboot-整合日志(logback-config.xml)

logback-config.xml 是一个用于配置 Logback 日志框架的 XML 文件&#xff0c;通常位于项目的 classpath 下的根目录或者 src/main/resources 目录下。 Logback 提供了丰富的配置选项&#xff0c;可以满足各种不同的日志需求。需要根据具体情况进行配置。 项目创建&#xff0…

Nginx、Tomcat等项目部署问题及解决方案详解

目录 前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的常见原因 2. 端口开启问题2.1 Windows环境下的端口开放2.2 Linux环境下的端口开放 3. 重视日志分析3.1 Nginx日志分析3.2 Tomcat日志分析 4. 开发环境与部署后运行结果不同4.1 开发环境与生产…

redis的配置文件解析

我的后端学习大纲 我的Redis学习大纲 1.1.Redis的配置文件&#xff1a; 1.Redis的配置文件名称是&#xff1a;redis.conf 2.在vim这个配置文件的时候&#xff0c;默认是不显示行号的&#xff0c;可以编辑下面这个文件&#xff0c;末尾加上set nu&#xff0c;就会显示行号: 1.…

kafka 如何减少数据丢失?

大家好&#xff0c;我是锋哥。今天分享关于【kafka 如何减少数据丢失?】面试题&#xff1f;希望对大家有帮助&#xff1b; kafka 如何减少数据丢失? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Apache Kafka 是一个高吞吐量的分布式消息队列&#xff0c;广泛用…

初探Vue前端框架

文章目录 简介什么是Vue概述优势MVVM框架 Vue的特性数据驱动视图双向数据绑定指令插件 Vue的版本版本概述新版本Vue 3Vue 3新特性UI组件库UI组件库概述常用UI组件库 安装Vue安装Vue查看Vue版本 实例利用Vue命令创建Vue项目切换工作目录安装vue-cli脚手架创建Vue项目启动Vue项目…

Java应用程序的测试覆盖率之设计与实现(三)-- jacoco cli 客户端

一、背景 上文已把覆盖率数据采集好了,并提供远程连接的tcp地址及端口。 jacoco cli文档jacoco cli jar包jacococli.jar 我下载好了,放在github工程里。 本文主要是介绍如何使用jacoco cli 客户端读取并生成覆盖率报告。 二、使用 1、dump覆盖率统计 java -jar doc/jacoc…

提升数据处理效率:TDengine S3 的最佳实践与应用

在当今数据驱动的时代&#xff0c;如何高效地存储与处理海量数据成为了企业面临的一大挑战。为了解决这一问题&#xff0c;我们在 TDengine 3.2.2.0 首次发布了企业级功能 S3 存储。这一功能经历多个版本的迭代与完善后&#xff0c;逐渐发展成为一个全面和高效的解决方案。 S3…

vue计算属性报错:Computed property “energyTotal“ was assigned to but it has no setter.

我页面中的应用 <el-input-number v-model"energyTotal" placeholder"请输入" disabled class"" :precision"2" :max"100000000" :controls"false"></el-input-number>computed:{carbonTotal(){/*…

ubuntu20.04上使用 Verdaccio 搭建 npm 私有仓库

安装nvm 首先安装必要的工具&#xff1a; apt update apt install curl下载并执行nvm安装脚本&#xff1a; curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash添加环境变量&#xff08;如果安装脚本没有自动添加&#xff09;。编辑 ~/.bash…