【C语言】初阶数据结构相关习题(二)
🎆个人主页:夜晚中的人海
今日语录:知识是从刻苦劳动中得来的,任何成就都是刻苦劳动的结果。——宋庆龄
文章目录
- 🎄一、链表内指定区间翻转
- 🎉二、从链表中删去总和值为零的节点
- 🚀三、链表求和
- 🏝️四、括号的最大嵌套深度
- 🚘五、整理字符串
- 🏖️六、从根到叶的二进制数之和
- ⭐七、二叉树的坡度
🎄一、链表内指定区间翻转
题目描述:链表内指定区间翻转
解题思路:
1.首先处理特殊情况,如果m == n 时,说明反转的区间只有一个节点,无需进行任何操作,直接返回原链表的头节点 head。
2.创建一个虚拟头节点 ret,并将其 next 指针指向链表的头节点 head。
(虚拟头节点的作用是简化边界情况的处理,例如当反转区间包括头节点时,可以避免复杂的头插操作。)
3.使用两个指针 pm 和 pn。pn 用于定位反转区间的前一个节点,pm 用于定位反转区间的起始节点。
4.通过第一个for循环,可以将pm指向第m个节点,pn指向第m - 1个节点。
5.再通过使用第二个 for 循环,从第 m 个节点开始,逐个反转节点,直到第 n 个节点。
6.最后返回虚拟头结点的下一个节点即(ret -> next)即反转后的链表的头节点。
代码实现:
struct ListNode* reverseBetween(struct ListNode* head, int m, int n )
{struct ListNode* ret = (struct ListNode*)malloc(sizeof(struct ListNode));ret->next = head;struct ListNode* pm = ret;struct ListNode* pn = head;if(m == n){return head;}for(int i = 0;i < m;i++){pn = pm;pm = pm->next;}for(int i = m;i < n;i++){struct ListNode* mid = pm->next;pm->next = mid->next;mid->next = pn->next;pn->next = mid;}return ret->next;
}
🎉二、从链表中删去总和值为零的节点
题目描述:从链表中删去总和值为零的节点
解题思路:
1.首先创建一个虚拟头节点 ret,并将其 next 指针指向链表的头节点 head。
2.使用一个指针 prev 从虚拟头节点开始遍历链表。
(prev 的作用是记录当前需要检查的子链表的起始节点的前一个节点)
3.使用两个循环,外层循环用于遍历链表,内层循环负责检查子链表的和是否为0。
4.两层循环都结束后,返回虚拟头节点 ret 的下一个节点(ret->next),即处理后的链表的头节点。
代码实现:
struct ListNode* removeZeroSumSublists(struct ListNode* head) {struct ListNode* ret = (struct ListNode*)malloc(sizeof(struct ListNode));ret->next = head;struct ListNode* prev = ret;while(prev){int sum = 0;//内部计算结果struct ListNode* cur = prev->next;while(cur){sum -= cur->val;if(sum == 0){prev->next = cur->next;}cur = cur->next;}prev = prev->next;}return ret->next;
}
🚀三、链表求和
题目描述:链表求和
解题思路:
1.检查输入是否合法,如果l1和l2都为空,那么直接返回0。
2.创建一个虚拟头节点 dummy,并初始化一个指针 cur 指向虚拟头节点。使用变量 count 表示进位。
3.使用 while 循环遍历两个链表,直到两个链表都为空。
4.在每次循环中,获取当前节点的值,创建一个新的节点 newnode,其值为 data,并将其连接到结果链表中。
5.如果l1不为空或者l2不为空,则还需进行判断,直到两个链表都为空时。
6.如果循环结束后,count 不为 0,说明还有进位需要处理。创建一个新的节点,其值为 count,并将其连接到结果链表的末尾。
代码实现:
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2) {if(l1 && l2 == NULL){return 0;}struct ListNode* dummy = (struct ListNode*)malloc(sizeof(struct ListNode));struct ListNode* cur = dummy;//进位int count = 0;while(l1 || l2){int val1 = (l1?l1->val:0);int val2 = (l2?l2->val:0);int sum = val1 + val2 + count;//获取个位int data = sum % 10;count = sum / 10;struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = data;newnode->next = NULL;cur->next = newnode;cur = cur->next;if(l1){l1 = l1->next;}if(l2){l2 = l2->next;}}if(count){struct ListNode* newnode = (struct ListNode*)malloc(sizeof(struct ListNode));newnode->val = count;newnode->next = NULL;cur->next = newnode;}return dummy->next;
}
🏝️四、括号的最大嵌套深度
题目描述:括号的最大嵌套深度
解题思路:
1.首先创建三个变量:top用于记录当前括号的嵌套层数;count用于记录最大的嵌套深度;i用于遍历字符串的索引。
2.使用 while 循环遍历字符串,直到遇到字符串的结束符 ‘\0’。
3.遇到左括号时,top+1,使用fmax函数更新count,确保count始终处于记录最大嵌套的深度。
4.遇到右括号时,top–。
5.循环结束后,返回count即代表最大的嵌套深度。
代码实现:
int maxDepth(char* s) {int top = 0;int count = 0;int i = 0;while(s[i] != '\0'){if(s[i] == '('){top++;count = fmax(top,count);}else if(s[i] == ')'){top--;}i++;}return count;
}
🚘五、整理字符串
题目描述:整理字符串
解题思路:
1.首先创建三个变量,i用于遍历字符串的索引;len表示字符串的长度;top用于模拟栈的栈顶指针,初始值为-1,表示栈为空。
2.使用一个循环遍历字符串,每次将当前字符放入栈中。
3.检查栈顶的两个字符是否满足相邻且大小写不同的条件,如果满足则移除这两个字符,否则继续处理下一个字符。
4.循环结束后,栈中剩余的字符即为结果。
代码实现:
char* makeGood(char* s) {int i = 0;int len = strlen(s);int top = -1;for(i = 0;i<len;i++){s[++top] = s[i];if(top > 0){if(abs(s[top] - s[top - 1]) == 'a' - 'A'){top -= 2;}}}s[top + 1] = '\0';return s;
}
🏖️六、从根到叶的二进制数之和
题目描述:从根到叶的二进制数之和
解题思路:
1.首先处理特殊情况,如果当前节点为空,则返回0,表示没有路径。
2.若节点不为空,则将当前节点的值加入路径的二进制表示中。
3.如果当前节点是叶子节点,则返回当前路径的二进制值val。
4.如果当前节点不是叶子节点,递归计算左子树和右子树的路径和,并将结果相加。
5.最后在主函数中调用Count,从根节点开始,初始路径值为0。
代码实现:
//计算左右路径之和
int Count(struct TreeNode* root,int val)
{if(root == NULL){return 0;}val = (val<<1) + root->val;if(root->left == NULL && root->right == NULL){return val;}return Count(root->left,val) + Count(root->right,val);
}int sumRootToLeaf(struct TreeNode* root) {return Count(root,0);
}
⭐七、二叉树的坡度
题目描述:二叉树的坡度
解题思路:
1.使用一个辅助函数Count,用于计算以 root 为根的子树的所有节点值之和。
2.在使用一个辅助函数prevOrder,用于通过前序遍历计算整棵树的坡度,并将结果累加到 sum 中。
3.最后在主函数中定义一个变量ret,表示整棵树的坡度,通过调用prevOrder函数,从根节点开始计算整棵树的倾斜度。
4.最后返回坡度ret即可。
代码实现:
int Count(struct TreeNode* root)
{if(root == NULL){return 0;}return Count(root->left) + Count(root->right) + root->val;
}void prevOrder(struct TreeNode* root,int* sum)
{if(root == NULL){return;}int left = Count(root->left);int right = Count(root->right);(*sum) += abs(left - right);prevOrder(root->left,sum);prevOrder(root->right,sum);
}int findTilt(struct TreeNode* root) {int ret = 0;prevOrder(root,&ret);return ret;
}
今天的分享就到这里啦,如果感到不错,希望能给博主一键三连,感谢大家的支持!希望这篇文章可以帮到大家,我们下期再见!
相关文章:

【C语言】初阶数据结构相关习题(二)
🎆个人主页:夜晚中的人海 今日语录:知识是从刻苦劳动中得来的,任何成就都是刻苦劳动的结果。——宋庆龄 文章目录 🎄一、链表内指定区间翻转🎉二、从链表中删去总和值为零的节点🚀三、链表求和&…...

嵌入式学习--江科大51单片机day7
我们在听课的过程中,可能对老师讲的有疑问,或者有些自己的理解,我们可以去问豆包,包括在写博客的时候我也是,不断去问豆包保证思考的正确性。(有人感觉豆包很low啊,其实这些基础性的东西豆包一般…...
基于大模型预测围术期麻醉苏醒时间的技术方案
目录 一、数据收集与处理(一)数据来源(二)数据预处理二、大模型构建与训练(一)模型选择(二)模型训练三、围术期麻醉苏醒时间预测(一)术前预测(二)术中动态预测四、并发症风险预测(一)风险因素分析(二)风险预测模型五、基于预测制定手术方案(一)个性化手术规划…...

Element Plus 取消el-form-item点击触发组件,改为原生表单控件
文章目录 问题:方法一:使用全局样式覆盖(推荐)方法二:自定义指令(更灵活)方法三:封装高阶组件方法四:运行时DOM修改(不推荐) 问题: 描…...
javascript —— ! 和 !! 的区别与作用
javascript —— ! 和 !! 的区别与作用 在 JavaScript 里,! 和 !! 是两种不同的逻辑运算符,它们的功能和使用场景有明显区别。 1、 !(逻辑非运算符) 它的主要作用是 对操作数进行布尔值取反。具体来说,就是 先把操作…...
鸿蒙 ArkUI - ArkTS 组件 官方 UI组件 合集
ArkUI 组件速查表 鸿蒙应用开发页面上需要实现的 UI 功能组件如果在这 100 多个组件里都找不到,那就需要组合造轮子了 使用技巧:先判断需要实现的组件大方向,比如“选择”、“文本”、“信息”等,或者是某种形状比如“块”、“图…...
LLM笔记(三)位置编码(1)
位置编码理论与应用 1. 位置编码如何解决置换不变性及其数学表现 在Transformer模型中,自注意力机制(Self-Attention)具有置换不变性(permutation invariance),这意味着对输入序列的词元(toke…...
麒麟v10 部署 MySQL 5.6.10 完整步骤
需要包的私信我 一、安装依赖(Perl环境) # 在线安装依赖 yum -y install perl perl-devel# 离线安装(需提前下载好rpm包) mkdir /data/ybn/soft/pre yum install --downloadonly --downloaddir/data/ybn/soft/pre perl perl-dev…...

Git-学习笔记(粗略版)
前言 很多人都听过git,github这些名词,但是它们是什么,怎么使用?git和github是一个东西吗?本文将详细解答这些问题,彻底弄懂git。 1.Git是啥❓ 有一天,我们的插画师小王接到一个绘画订单,但奈…...

专项智能练习(定义判断)
1. 单选题 热传导是介质内无宏观运动时的传热现象,其在固体、液体和气体中均可发生。但严格而言,只有在固体中才是纯粹的热传导,在流体(泛指液体和气体)中又是另外一种情况,流体即使处于静止状态ÿ…...
失控的产品
大部分程序员很难有机会做一个新的产品,绝大多时候去一家新公司也都是在旧产品上修修补补。 笔者还是很幸运得到了开发新品的机会,从2023年开始做,中间经历了许多磕磕碰碰。 有的小伙伴从中离开,偶尔又加入1~2个人,但…...

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error
Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考:https://www.bilibili.com/opus/977469285985157129 A9 - A11(iPhone6s-X):iOS15.0-16.6.1 A12-A14(iPhoneXR-12PM…...
无线定位之 二 SX1302 网关源码 thread_down 线程详解
前言 笔者计划通过无线定位系列文章、系统的描述 TDOA 无线定位和混合定位相关技术知识点, 并以实践来验证此定位系统精度。 笔者从实践出发、本篇直接走读无线定位系统关键节点、网关 SX1302 源码框架,并在源码走读过程 中、着重分析与无线定位相关的PPS时间的来龙去脉、并在…...

对心理幸福感含义的探索 | 幸福就是一切吗?
注:机翻,未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗?对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …...
多平台图标设计与管理的终极解决方案
IconWorkshop Pro 是一款由Axialis团队开发的专业图标设计与制作软件,专注于为设计师、开发者及企业用户提供高效且灵活的图标创作解决方案。该软件凭借其强大的功能与跨平台适配性,成为Windows、macOS、iOS、Android等多系统图标设计的首选工具之一。 …...
ngx_http_keyval_module动态键值管理
一、模块安装与验证 检查模块是否可用 nginx -V 2>&1 | grep --color -o ngx_http_keyval_module如果看到 ngx_http_keyval_module,说明模块已编译进 NGINX。 若未找到,请联系你的 NGINX 供应商,获取商业版或重新编译并启用该模块&am…...

【高频面试题】LRU缓存
文章目录 1 相关前置知识(OS)2 面试题 16.25. LRU 缓存2.1 题面2.2 示例2.3 解法1 (双端队列哈希表)思路 2.4 解法2思路 3 参考 1 相关前置知识(OS) 为什么需要页面置换算法:当进程运行时&…...

讯联云库项目开发日志(二)AOP参数拦截
目录 利用AOP实现参数拦截: 一、HTTP请求进入Controller(发送邮件验证码) 二、AOP切面触发 1. 切面拦截(GlobalOperactionAspect.class) method.getAnnotation() null interceptor 判断 2.参数校验注解 3. 参…...

龙虎榜——20250515
上证指数缩量收阴线,个股跌多涨少,上涨波段4月9日以来已有24个交易日,时间周期上处于上涨末端,注意风险。 深证指数缩量收阴线,日线上涨结束的概率在增大,注意风险。 2025年5月15日龙虎榜行业方向分析 一…...
知识图谱重构电商搜索:下一代AI搜索引擎的底层逻辑
1. 搜索引擎的进化论 从雅虎目录式搜索到Google的PageRank算法,搜索引擎经历了三次技术跃迁。而AI搜索引擎正在掀起第四次革命:在电商场景中,传统的「关键词匹配」已无法满足个性化购物需求,MOE搜索等新一代架构开始融合知识图谱…...
python-修改图片背景色
在Python中,可以使用图像处理库(如OpenCV或Pillow)来修改图片的背景色。通常,修改背景色的流程包括以下步骤: 1、对图片进行分割,识别前景和背景。 2、对背景区域进行颜色替换。 下面是两种实现方法&#x…...

卡洛诗,将高端西餐的冗余价值转化为普惠体验
西餐市场正经历一场结构性变革,一二线城市的高端西餐陷入内卷,而下沉市场却因品质与价格断层陷入选择困境——消费者既不愿为高价西餐的面子溢价买单,又难以忍受快餐式西餐的粗糙体验。这一矛盾催生了万亿级的市场真空地带,萨莉亚…...
【ROS2】ROS节点启动崩溃:rclcpp::exceptions::RCLInvalidArgument
1、问题描述 启动ROS节点时,直接崩溃,打印信息如下: terminate called after throwing an instance of rclcpp::exceptions::RCLInvalidArgumentwhat(): failed to create guard condition: context argument is null, at ./src/rcl/guard_condition.c:65 [ros2run]: Abo…...

Flutter在键盘的上方加一个完成按钮
有些情况下,输入框在输入键盘弹出后, 需要在键盘的上方显示一个toolbar , 然后 toolbar 上面一个完成按钮,点完成按钮把键盘关闭。 如图: 直接上代码,这样写的好处是,把 TextField 给封装了&…...

SQL注入---05--跨站注入
1 权限说明 select * from mysql.user; 这里的Y表示我前面的命令权限为root,n表示不支持root权限 导致结果: 如果为root的话,我就可操作这些命令并且可以进行跨数据库攻击,但是如果不是高权限root就无法执行这些操作 2 root权限…...
Vue 学习随笔系列二十三 -- el-date-picker 组件
el-date-picker 组件 文章目录 el-date-picker 组件el-date-picker 只有某些日期可选 el-date-picker 只有某些日期可选 <template><div><el-form ref"form" size"mini":model"form" :rules"rules"label-width"8…...

【免费分享】虚拟机VM(适用于 Windows)17.6.3
—————【下 载 地 址】——————— 【本章下载一】:https://drive.uc.cn/s/7c4da5cd2af64 【本章下载二】:https://pan.xunlei.com/s/VOQDkRRKc5OUVTauZezaiDEHA1?pwdpybg# 【百款黑科技】:https://ucnygalh6wle.feishu.cn/wiki/…...
Oracle中的select1条、几条、指定范围的语句
在Oracle中,可以使用不同的方法来选择一条记录、多条记录或指定范围内的记录。以下是具体的实现方式: 1. 查询单条记录 使用ROWNUM伪列限制结果为1条: SELECT * FROM your_table WHERE ROWNUM 1;特点:Oracle会在结果集生成时分…...

2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息
一、框架以及准备工作 1、前端项目文件结构展示 2、后端项目文件结构展示 3、登录微信公众平台,注册一个个人的程序,获取大appid(前端后端都需要)和密钥(后端需要) 微信公众平台微信公众平台&…...
校园网规划与设计方案
一、项目概述 校园网是学校实现信息化教学、科研与管理的重要基础设施,其性能与稳定性直接影响学校的整体发展。随着学校规模不断扩大、教学科研活动日益丰富,对校园网的带宽、可靠性、安全性以及智能化管理等方面提出了更高要求。本规划与设计方案旨在构建一个高速、稳定、…...