【C语言】初阶数据结构相关习题(二)

【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)即反转后的链表的头节点。

代码实现:

structListNode*reverseBetween(structListNode* head,int m,int n ){structListNode* ret =(structListNode*)malloc(sizeof(structListNode)); ret->next = head;structListNode* pm = ret;structListNode* 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++){structListNode* 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),即处理后的链表的头节点。

代码实现:

structListNode*removeZeroSumSublists(structListNode* head){structListNode* ret =(structListNode*)malloc(sizeof(structListNode)); ret->next = head;structListNode* prev = ret;while(prev){int sum =0;//内部计算结果structListNode* 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,并将其连接到结果链表的末尾。

代码实现:

structListNode*addTwoNumbers(structListNode* l1,structListNode* l2){if(l1 && l2 ==NULL){return0;}structListNode* dummy =(structListNode*)malloc(sizeof(structListNode));structListNode* 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;structListNode* newnode =(structListNode*)malloc(sizeof(structListNode)); newnode->val = data; newnode->next =NULL; cur->next = newnode; cur = cur->next;if(l1){ l1 = l1->next;}if(l2){ l2 = l2->next;}}if(count){structListNode* newnode =(structListNode*)malloc(sizeof(structListNode)); 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即代表最大的嵌套深度。

代码实现:

intmaxDepth(char* s){int top =0;int count =0;int i =0;while(s[i]!='\0'){if(s[i]=='('){ top++; count =fmax(top,count);}elseif(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。

代码实现:

//计算左右路径之和intCount(structTreeNode* root,int val){if(root ==NULL){return0;} val =(val<<1)+ root->val;if(root->left ==NULL&& root->right ==NULL){return val;}returnCount(root->left,val)+Count(root->right,val);}intsumRootToLeaf(structTreeNode* root){returnCount(root,0);}

⭐七、二叉树的坡度

题目描述:二叉树的坡度

在这里插入图片描述

解题思路:
1.使用一个辅助函数Count,用于计算以 root 为根的子树的所有节点值之和。

2.在使用一个辅助函数prevOrder,用于通过前序遍历计算整棵树的坡度,并将结果累加到 sum 中。

3.最后在主函数中定义一个变量ret,表示整棵树的坡度,通过调用prevOrder函数,从根节点开始计算整棵树的倾斜度。

4.最后返回坡度ret即可。

代码实现:

intCount(structTreeNode* root){if(root ==NULL){return0;}returnCount(root->left)+Count(root->right)+ root->val;}voidprevOrder(structTreeNode* 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);}intfindTilt(structTreeNode* root){int ret =0;prevOrder(root,&ret);return ret;}

今天的分享就到这里啦,如果感到不错,希望能给博主一键三连,感谢大家的支持!希望这篇文章可以帮到大家,我们下期再见!

Read more

AppFlowy 终极安装配置完整教程:快速搭建个人AI知识库

AppFlowy 终极安装配置完整教程:快速搭建个人AI知识库 【免费下载链接】AppFlowyAppFlowy 是 Notion 的一个开源替代品。您完全掌控您的数据和定制化需求。该产品基于Flutter和Rust构建而成。 项目地址: https://gitcode.com/GitHub_Trending/ap/AppFlowy 还在为寻找完美的知识管理工具而烦恼吗?想要一个既强大又完全掌控数据的协作平台?AppFlowy作为Notion的开源替代品,为您提供AI协同工作空间,让项目管理、知识整理和团队协作变得前所未有的简单高效!🎯 📋 环境准备:搭建完美开发基础 在开始安装之前,请确保您的系统满足以下基本要求: 系统要求 * 操作系统:macOS 10.15+、Windows 10+ 或 Linux Ubuntu 18.04+ * 内存:建议8GB以上RAM * 存储空间:至少5GB可用空间 * 网络连接:稳定的互联网连接用于下载依赖 必备工具安装 首先需要安装Flutter和Rust开发环境: Flutter SDK安装:

By Ne0inhk

Ubuntu 24.04 LTS WSL 下载地址

地址可能会变,但是进入官网后,就按照链接的文件夹目录,一个一个找就可以找到的(亲测:清华大学镜像地址是可以的) https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/noble/ 一、Ubuntu 官方 WSL 稳定版(.wsl,双击/导入都稳) * Ubuntu 24.04.2 LTS WSL 官方稳定版(x64) https://releases.ubuntu.com/noble/ubuntu-24.04.2-wsl-amd64.wsl 二、国内清华镜像(下载最快、最稳) * 清华镜像 Ubuntu 24.04.2 WSL 稳定版(

By Ne0inhk
Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置)

Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置)

Ubuntu 22.04 安装 Docker 完整步骤(附镜像加速配置) 摘要 Docker 作为容器化技术的核心工具,凭借轻量、可移植、隔离性强的特性,已成为开发者部署应用、运维人员管理服务的必备工具。Ubuntu 22.04 LTS 作为长期支持版本,具备稳定、兼容的优势,是 Docker 部署的优选系统。本文将从环境准备、Docker 核心组件安装、配置验证、镜像加速优化、常见问题排查五个维度,提供详细且可复现的完整步骤,包含规范代码段、操作流程图解及实用技巧,同时规避 Ubuntu 22.04 系统下的安装陷阱,帮助新手快速上手 Docker 部署,助力开发者提升应用交付效率。无论是个人开发测试场景,还是小型生产环境部署,都能通过本文内容实现 Docker 的快速落地与优化。 🚀 个人主页 :有点流鼻涕

By Ne0inhk
Flutter for OpenHarmony:Flutter 三方库 os_detect — 精准洞察鸿蒙系统的底层脉络(适配鸿蒙 HarmonyOS Next ohos)

Flutter for OpenHarmony:Flutter 三方库 os_detect — 精准洞察鸿蒙系统的底层脉络(适配鸿蒙 HarmonyOS Next ohos)

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net。 Flutter for OpenHarmony:Flutter 三方库 os_detect — 精准洞察鸿蒙系统的底层脉络(适配鸿蒙 HarmonyOS Next ohos) 在进行 Flutter for OpenHarmony 跨平台开发时,我们经常需要处理“差异化”的需求。有的功能可能只在真正的 OpenHarmony 原生环境下运行(如特定的 N-API 调用),而在 Web 或其他桌面模拟器环境下则需要进行降级处理。 传统的 Platform.isAndroid 或 kIsWeb 在处理日渐复杂的鸿蒙生态环境时,往往显得力不从心。os_detect 库提供了一套更轻量、更可靠的系统环境感知方案,能帮助我们精准识别应用正跑在哪个“灵魂”之下。 一、为什么需要系统环境检测?

By Ne0inhk