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

news2025/7/16 19:17:40

在这里插入图片描述
🎆个人主页:夜晚中的人海

在这里插入图片描述

今日语录:知识是从刻苦劳动中得来的,任何成就都是刻苦劳动的结果。——宋庆龄

文章目录

  • 🎄一、链表内指定区间翻转
  • 🎉二、从链表中删去总和值为零的节点
  • 🚀三、链表求和
  • 🏝️四、括号的最大嵌套深度
  • 🚘五、整理字符串
  • 🏖️六、从根到叶的二进制数之和
  • ⭐七、二叉树的坡度

🎄一、链表内指定区间翻转

题目描述:链表内指定区间翻转

在这里插入图片描述

解题思路:
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;
}

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

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

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

相关文章

嵌入式学习--江科大51单片机day7

我们在听课的过程中&#xff0c;可能对老师讲的有疑问&#xff0c;或者有些自己的理解&#xff0c;我们可以去问豆包&#xff0c;包括在写博客的时候我也是&#xff0c;不断去问豆包保证思考的正确性。&#xff08;有人感觉豆包很low啊&#xff0c;其实这些基础性的东西豆包一般…

Element Plus 取消el-form-item点击触发组件,改为原生表单控件

文章目录 问题&#xff1a;方法一&#xff1a;使用全局样式覆盖&#xff08;推荐&#xff09;方法二&#xff1a;自定义指令&#xff08;更灵活&#xff09;方法三&#xff1a;封装高阶组件方法四&#xff1a;运行时DOM修改&#xff08;不推荐&#xff09; 问题&#xff1a; 描…

Git-学习笔记(粗略版)

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

专项智能练习(定义判断)

1. 单选题 热传导是介质内无宏观运动时的传热现象&#xff0c;其在固体、液体和气体中均可发生。但严格而言&#xff0c;只有在固体中才是纯粹的热传导&#xff0c;在流体&#xff08;泛指液体和气体&#xff09;中又是另外一种情况&#xff0c;流体即使处于静止状态&#xff…

【iOS安全】Dopamine越狱 iPhone X iOS 16.6 (20G75) | 解决Jailbreak failed with error

Dopamine越狱 iPhone X iOS 16.6 (20G75) Dopamine兼容设备 参考&#xff1a;https://www.bilibili.com/opus/977469285985157129 A9 - A11&#xff08;iPhone6s&#xff0d;X&#xff09;&#xff1a;iOS15.0-16.6.1 A12-A14&#xff08;iPhoneXR&#xff0d;12PM&#xf…

对心理幸福感含义的探索 | 幸福就是一切吗?

注&#xff1a;机翻&#xff0c;未校。 Happiness Is Everything, or Is It? Explorations on the Meaning of Psychological Well-Being 幸福就是一切吗&#xff1f;对心理幸福感含义的探索 Journal of Personality and Social Psychology 1989, Vol. 57, No. 6,1069-1081 …

【高频面试题】LRU缓存

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

讯联云库项目开发日志(二)AOP参数拦截

目录 利用AOP实现参数拦截: 一、​​HTTP请求进入Controller​&#xff08;发送邮件验证码&#xff09; 二、AOP切面触发 1. 切面拦截&#xff08;GlobalOperactionAspect.class&#xff09; method.getAnnotation()​​ null interceptor 判断​​ 2.参数校验注解 3. 参…

龙虎榜——20250515

上证指数缩量收阴线&#xff0c;个股跌多涨少&#xff0c;上涨波段4月9日以来已有24个交易日&#xff0c;时间周期上处于上涨末端&#xff0c;注意风险。 深证指数缩量收阴线&#xff0c;日线上涨结束的概率在增大&#xff0c;注意风险。 2025年5月15日龙虎榜行业方向分析 一…

卡洛诗,将高端西餐的冗余价值转化为普惠体验

西餐市场正经历一场结构性变革&#xff0c;一二线城市的高端西餐陷入内卷&#xff0c;而下沉市场却因品质与价格断层陷入选择困境——消费者既不愿为高价西餐的面子溢价买单&#xff0c;又难以忍受快餐式西餐的粗糙体验。这一矛盾催生了万亿级的市场真空地带&#xff0c;萨莉亚…

Flutter在键盘的上方加一个完成按钮

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

SQL注入---05--跨站注入

1 权限说明 select * from mysql.user; 这里的Y表示我前面的命令权限为root&#xff0c;n表示不支持root权限 导致结果&#xff1a; 如果为root的话&#xff0c;我就可操作这些命令并且可以进行跨数据库攻击&#xff0c;但是如果不是高权限root就无法执行这些操作 2 root权限…

【免费分享】虚拟机VM(适用于 Windows)17.6.3

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/7c4da5cd2af64 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDkRRKc5OUVTauZezaiDEHA1?pwdpybg# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…

2025 后端自学UNIAPP【项目实战:旅游项目】5、个人中心页面:微信登录,同意授权,获取用户信息

一、框架以及准备工作 1、前端项目文件结构展示 2、后端项目文件结构展示 3、登录微信公众平台&#xff0c;注册一个个人的程序&#xff0c;获取大appid&#xff08;前端后端都需要&#xff09;和密钥&#xff08;后端需要&#xff09; 微信公众平台微信公众平台&…

蓝桥杯算法题 -蛇形矩阵(方向向量)

&#x1f381;个人主页&#xff1a;工藤新一 &#x1f50d;系列专栏&#xff1a;C面向对象&#xff08;类和对象篇&#xff09; &#x1f31f;心中的天空之城&#xff0c;终会照亮我前方的路 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 文章目录 P…

配置VScodePython环境Python was not found;

Python was not found; run without arguments to install from the Microsoft Store, or disable this shortcut from Settings > Manage App Execution Aliases. 候试试重启电脑。 在卸载重装python后会出现难以解决的局面&#xff0c;系统变量&#xff0c;命令行&#…

ollama 重命名模型

ollama 重命名模型 ollama list# 查看列表 ollama list # 生成原模型的Modelfile文件 ollama show --modelfile qwen3:32b > Modelfile # 从Modelfile文件创建新的模型 ollama create qwen3 -f Modelfile # 删除原模型 ollama rm qwen3:32b

Qt信号槽机制与UI设计完全指南:从基础原理到实战应用

目录 前言一、信号槽1.1 传参1.2 Qt信号与槽的对应关系1.2.1一对多关系1.2.2 多对一关系 二、Designer三、Layout 布局3.1 基础用法3.2 打破布局3.3 贴合窗口3.4 伸展器&#xff08;Spacer&#xff09;3.5 嵌套布局 四、ui指针五、QWidget六、QLabel 标签使用指南总结 前言 本…

XBL6501/02/03在POE设备上的应用方案

前言&#xff1a; 在当今数字化时代&#xff0c;POE&#xff08;Power over Ethernet&#xff09;设备因其能够通过以太网线同时传输数据和电力而被广泛应用。为了满足这些设备日益增长的电源需求&#xff0c;芯伯乐推出了XBL6501/02/03系列DC-DC电源芯片&#xff0c;为POE设备…

编程题 03-树2 List Leaves【PAT】

文章目录 题目输入格式输出格式输入样例输出样例 题解解题思路完整代码 编程练习题目集目录 题目 Given a tree, you are supposed to list all the leaves in the order of top down, and left to right. 输入格式 Each input file contains one test case. For each case, …