单链表经典算法题 1

前言 

学习了单链表,我们就做一些题来巩固一下。还有就是解题方法不唯一,我就只讲述为自己的方法。

目录

前言 

1.移除链表元素

 思路

代码 

2.反转链表

 思路

 代码 

3.链表的中间节点

思路 

 代码 

总结


1.移除链表元素

 思路

我们创建一个新的表,来储存和val值不一样的节点。还可以在原表上删除和val值相同的节点。

这里我是新创建一个表来接受不等于val的节点。通过发现我们应该通过采取尾插的方式来储存新节点。如果循环里面就只要尾插会导致新表的头节点还是指向空指针,导致输出错误。所以还要考虑新链表的头节点是否为空,为空的话我们就新表的头节点和尾节点指向第一个节点。

完成以上步骤后会变成下面的样子,最后一个节点还是指向要被删除的节点。导致输出结果还是含有被删除的值。所以我们要进行优化,把新链表的尾节点指向NULL。最后返回头节点就可以了。

代码 

typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) 
{ListNode*newhead,*newtail;//新链表的头尾节点newhead=newtail=NULL;//遍历原链表ListNode* prev=head;while(prev){if(prev->val!=val){if(newhead==NULL){newhead=newtail=prev;}else{newtail->next=prev;newtail=newtail->next;}}prev=prev->next;}if(newtail)newtail->next=NULL;return newhead;
}

2.反转链表

 思路

这里我的想法是反转链表指向来实现题目的效果,定义3个节点,分别用来存储NULL、第一个节点、第二个节点循环反转指向,然后在循环让3个节点都向后移动,其中n3、最先指向空其次是n2、最后是n1  n2->next=n1;      n1=n2;     n2=n3;    n3=n3->next;   这些就是向后移动的代码

我们最后要返回含val=5的节点所以我们就让n2充当循环结束的条件,但是这样写会出错,因为n3最早变成空指针,就可以对空指针进行解引用操作了。所以在前面加上一个if版判语句

if(n3)n3=n3->next;   最后返回n1就可以了。

如下图所示

 代码 

typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) 
{if(head==NULL){return head;}ListNode* n1,* n2,* n3;n1=NULL,n2=head,n3=n2->next;while(n2){n2->next=n1;n1=n2;n2=n3;if(n3)n3=n3->next;}return n1;
}

3.链表的中间节点

思路 

这里介绍一种新奇的方法,那就是快慢指针。快指针移动两次,慢指针移动一次。这里大家先知道怎么移动行了,不用深究为什么。后面我会为大家解答的。

根据例1移动我们发现当fast移动到最后时,slow就是我们要返回的值。我们又要把fast当作循环结束的条件。所以我们就可以想到fast->next 指针为空指针时结束循环。

根据例2移动我们可以等到循环结束的条件为fast为空指针时为循环结束条件。

我们把他们结合起来当作循环条件这样就万无一失了。返回慢指针(slow)

 

 代码 

typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) 
{ListNode* slow=head;ListNode* fast=head;while(fast && fast->next){slow=slow->next;fast=fast->next->next;}return slow;
}

总结

做这种链表的问题最好就是画图理清思路,然后再写代码。后还会为大家讲解单链表经典算法题 2。会持续更新的哦!!!

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

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

相关文章

docker-compose安装freeradius

freeradius docker 安装记录 docker安装freeradius #拉取镜像 docker pull freeradius/freeradius-server:latest #启动Freeradius容器 docker run -d --name freeradius-server -p 1812-1813:1812-1813/udp freeradius/freeradius-server #查看容器是否正常启动 docker ps -…

自学Java到找工作,最强学习路线,2024年最新版

本人是2024届的毕业生,自学Java的路上,也踩了不少的坑,希望在这里给小伙伴一些帮助,避免无效学习,一起进大厂! ✔学习顺序: Java基础 ➡ Java进阶 ➡ Java并发 ➡ 数据结构 ➡ MySQL ➡ JavaW…

Shell中( ),(( ))的区别

在Shell编程中,() 和 (( )) 是两种常见的操作符,它们在不同的上下文中起到不同的作用。理解这两者的区别及其应用场景,有助于编写更加高效和灵活的Shell脚本。本文将详细介绍 () 和 (( )) 的功能及其使用方法。 1. 子Shell (()) 括号 () 用于…

接口幂等性问题

接口幂等性问题 描述 接口幂等性是软件开发时常见的问题,其目的是要求确保当同一个接口被重复调用时其状态不会发生变化 示例 当前一个支付页面,不管用户在同一时间内点击多少次支付按钮,最终接口也只会生成一个支付订单,这就…

AWS 网络

Here is a more detailed explanation of AWS networking in Chinese: VPC(虚拟私有云) VPC 是一个专门为您的 AWS 账户分配的虚拟网络。您可以将 VPC 视为云端的一个虚拟数据中心。在创建 VPC 时,您可以指定以下内容: IP 地址…

长连接的钟表程序

实验要求 实现1个钟表程序(服务),多个用户可以从该程序获得时间并在本地显示,用户也可以修改时间。 (1)用户程序可以在计算机上运行,也可以在手机上运行; (2&#xff…

Java 18 的一些主要新特性

以下是 Java 18 的一些主要新特性: 简单 Web 服务器(JEP 408): Java 18 引入了一个简单的 Web 服务器,旨在帮助开发者更方便地测试和原型化。在命令行中使用 jwebserver 命令即可启动这个 Web 服务器。主要用于快速测试…

程序员如何挖掘项目开发出工具?(4)

如何利用最小的MVP(最小可行产品)模型找到第一个用户? 对许多人来说,找到第一个用户可能是整个过程中最具挑战性的部分,但在我看来,这其实是最简单的。 下面分享几个小技巧,如果你还是找不到第…

使用Kube-Bench对Kubernetes进行安全检测

使用Kube-Bench对Kubernetes进行安全检测 1. 工具介绍 Kube-Bench是一个开源的Go语言工具,用于自动化检查Kubernetes集群是否符合CIS Kubernetes基准。这些基准包括一系列关于Kubernetes配置和部署安全性的建议和最佳实践。 Kube-Bench执行了一系列针对Kubernete…

【Android】Android系统性学习——Android系统架构

前言 部分内容参考《Android进阶解密》 – 刘望舒 1. Android版本 官方链接:https://developer.android.com/studio/releases/platforms 里面有各个版本的官方文档,有些新功能的用法在这里面。 现在做安卓11,有时候需要向下兼容 2. AOSP …

【Python】在运行中使用warnings.filterwarnings,可以忽略测试中遇到的问题

在 Python 中,warnings 是一个内置模块,用于发出有关程序执行的警告信息,这些警告信息通常是关于程序行为的潜在问题。 不过,这些问题通常不是致命的错误,只不过是展示我们代码中潜在的问题,或不推荐的做法…

软件架构搞好了,还用担心代码可读性差?

目录 一、架构的概念及由来 二、小系统也需要架构思想 三、实现架构的思路 一、架构的概念及由来 嵌入式软件架构是指在嵌入式系统中用于组织和管理软件组件的结构和设计。嵌入式软件架构的出现是为了解决嵌入式系统中软件复杂度和系统要求不断增加的挑战。以下是嵌入式软件架…

【STM32进阶笔记】GPIO端口

前段时间由于其他原因,专栏暂停更新了较长一段时间,现在恢复更新,争取继续为大家创造有价值的内容,期待大家的订阅关注,欢迎互相学习交流。 在STM32速成笔记系列专栏中其实已经对GPIO的一些必要知识进行了介绍&#xf…

GPT4O给Qwen2生成的高考作文打分56分,从“小白”进阶技术大神的开发者基于国产GPU推理模型效果可还行?

OpenI启智社区上线的【芯动开源】首场活动-天数智芯挑战专场即将迎来最后一周的冲刺阶段,自2024年5月27日上线以来,这期间,我们见证了天数智芯通用GPU加速卡在适配AI模型方面的无限可能与开发者们开源精神的璀璨光辉。 在短短的两周时间里&a…

代码随想录算法训练营第二十三天|669. 修剪二叉搜索树、 108.将有序数组转换为二叉搜索树、 538.把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接:669. 修剪二叉搜索树 文档讲解:代码随想录 状态:还可以 思路: 如果节点的值在[low, high]之间,则递归修剪它的左子树和右子树。 节点值小于low:如果节点的值小于low&#xff…

智慧工厂自动装车解决方案:H13三维轮廓扫描激光雷达

激光雷达在智慧工厂自动装车的应用场景在智慧工厂的自动装车场景中,激光雷达的应用显得尤为关键。这种技术以其精确的测量和定位能力,助力自动化装车的每一个环节,大大提高了装车的效率和准确性。 首先,激光雷达在车辆定位方面发挥…

[next.js] svgr/webpack

nextjs如何配置svg文件,使其像react组件一样导入? 当前next.js 开发环境我使用了--turbo 来开启turbopack加速文件构建,所以之前的一些webpack loader之类的无法正常工作。通过搜索发现一般都是使用svgr/webpack来处理svg,打开svgr官网发现…

vscode 连接 GitHub

文章目录 连接 GitHub一、通过 SSH 连接 github二、通过 HTTPS 连接 github 连接 GitHub 在 vscode 中首次使用 git push 命令时会要求输入 github 账户的 username 和 password,这种基本身份验证在 2021.8.13 以前还是可以的,之后的话,就会…

Luma AI 推出梦幻机:据说吊打Sora和快手可灵(KLING)|TodayAI

近日,美国初创公司 Luma AI 宣布推出其最新的文本生成视频工具——梦幻机(Dream Machine)。这一消息发布的时间正好在中国科技公司快手推出其文本生成视频模型可灵(KLING)几天之后,标志着视频生成领域的又一…

Android Compose 十一:常用组件列表 compose自己个的 下拉刷新

列表下拉刷新 material3 还没有下拉刷新功能material:1.3.0 之后 swiperefresh 被弃用 被PullRefresh替代使用PullRefresh 需要添加依赖 implementation ‘androidx.compose.material:material:1.6.8’ 先上代码 var refreshing by remember {mutableStateOf(false)} val…