【C语言督学训练营 第十二天】三篇文章吃透数据结构中的线性表(三)----- 线性表考研真题

news2024/12/29 10:37:17

文章目录

  • 前言
  • 题目描述
  • 题目分析
  • 代码实战

前言

本篇博客从头到尾都在解析一道2019年考研真题中的一道关于链表的大题,虽然题目没有竞赛算法题那么复杂,那么难想,但是我们依旧可以从中收获到好多知识,本题的突破点就是快慢指针与链表反转。一份学习总会有一份收获吧!

题目描述

在这里插入图片描述

题目分析

先分析一下题目的流程,题目的大意是将一个序列,经过一定的算法变成a1,an…交替的样子,通过观察可以发现,新产生的序列奇数项是a1,a2,a3,…,偶数项为an,an-1,an-2…,所以我们不妨大胆猜想,中间的算法作用就是先将原序列分割成两半,然后将后半段反转,最后将分割后的两半依次拼接。

显然想法是行得通的,所以重新捋顺一下思路应该这么做:

  • 链表从中间分割 使用快慢指针
  • 链表逆置 采用辅助指针
  • 链表拼接 采用辅助指针

拓展(后面复习到还会再加进来):

  • 在判断链表是否是循环链表时也可以使用快慢指针的方法

于是我们不妨设置三个函数,每一个函数负责一个功能,在主函数中合理进行调度。暂且将splitList、reversal、concatList作为上述三个算法的函数名。
分析到这里,这个题目的脉络也就相对清晰了,接下来要做的就是细化分析步骤(也就是回答题目的第一小问)!
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

代码实战

这点代码着着实实撸了一下午,写的时候思路很清晰但是有奇数偶数项在干扰我们,其实这题里面奇数偶数项有影响也没影响,看我们咋想,操作比较简单注释就比较少了,如果有疑问就评论区留言吧!

//
// Created by Zhu Shichong on 2023/1/9.
//
#include <stdio.h>
#include<stdlib.h>
#define bool int
#define true 1
#define false 0
typedef int ElemType;
//数组类型
struct myList{
    ElemType data;
    struct myList* next;
};
typedef struct myList myList;

//遍历链表
void print_list(myList *head){
    if(head->next==NULL){
        printf("null!!!");
    }
    for (myList *p=head;p->next!=NULL;p=p->next){
        printf("%3d",p->next->data);
    }
    printf("\n");
}
//找出中间节点
myList *spliteList(myList *head){
    //p走路是二倍速,q是一倍速
    myList *p,*q;
    for(p=head->next,q=head->next;p->next!=NULL&&p->next->next!=NULL;p=p->next->next,q=q->next);
    p=q->next;
    q->next=NULL;
    return p;
}
//将后半段链表反转
myList *reversalList(myList* head){
    myList *p,*q,*r;
    if(head->next==NULL){
        return NULL;
    }
    p=head;
    q=p->next;
    r=q->next;
    p->next=NULL;
    for(;r!=NULL;){
        q->next=p;
        p=q;
        q=r;
        r=r->next;
    }
    q->next=p;

    return q;
}
//拼接数组
myList *concatList(myList* head,myList* l){
    myList *p,*tail;
    tail=head;
    p=head->next;
    while (l!=NULL&&p!=NULL){
        tail->next=p;
        p=p->next;
        tail->next->next=l;
        l=l->next;
        tail=tail->next->next;
    }
    if(p!=NULL){
        tail->next=p;
    }
    if(l!=NULL){
        tail->next=l;
    }
    return head;

}
int main() {
    // 创建一个头结点(头结点一般不用于存储信息)
    myList *head=(myList*)malloc(sizeof (myList));
    head->next=NULL;
    myList *tail=head;
    for(int i=1;i<7;i++){
        myList *p=NULL;
        p=(myList*) malloc(sizeof (myList));
        p->data=i;
        p->next=NULL;
        tail->next=p;
        tail=tail->next;
    }
    print_list(head);
    /*
     * 每调用一次spliteList(head)函数,链表长度就会减半
     * */
    print_list(concatList(head,reversalList(spliteList(head))));
    return 0;
}

最后是第三问,分析咱们算法的时间复杂度,这里每一个函数的时间复杂度是0.5n,三个函数加起来有1.5n,
忽略首项系数,该算法时间复杂度应为O(n)。


在这里插入图片描述

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

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

相关文章

AP5153 线性降压恒流驱动芯片 2.5A

AP5153 是一种 PWM 调光的、低压 差的 LED 线性降压恒流驱动器。 AP5153 仅需要外接一个电阻和一个 NMOS 管就可以构成一个完整的 LED 恒 流驱动电路&#xff0c; 调节该外接电阻就可以调节 输出电流&#xff0c;输出电流可调范围为 20mA 到 3.0A。 AP5153 还可以通过在 DIM…

echarts x轴与y轴 刻度 数据设置

xAxis: {nameTextStyle: {fontWeight: "bold",fontSize: "20",align: "left",},splitLine: {show: false,},axisLine: {show: true,symbol: ["none", "arrow"], //加箭头处symbolOffset: 0,lineStyle: {color: "rgb(12…

aardio的优缺点,强烈推荐大家试用一下,可以用它在windows下面写一些小工具

概述 官网 aardio是一种用于Windows平台的脚本编程语言&#xff0c;以及一个功能丰富的集成开发环境&#xff08;IDE&#xff09;。它结合了强大的原生Windows API访问能力和简单易学的语法。以下是aardio的一些优缺点。 优点&#xff1a; 简单易学&#xff1a;aardio的语法简…

Linux | 本地Yum源 | 网络Yum源(阿里云Yum源)

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; 本地Yum源配置 创建挂载点目录 [rootlocalhost ~]# mkdir /mnt/cdrom [rootlocalhost ~]# df /mnt/cdrom/ 文件系统 1K-块 已用 可用 已用%…

慎入坑:腾讯云轻量2核2G3M服务器30元不建议选择

腾讯云轻量应用服务器2核2G3M带宽30元3个月不建议买&#xff0c;自带3M带宽&#xff0c;下载速度可达384KB/秒&#xff0c;100%CPU性能&#xff0c;系统盘为40GB SSD盘&#xff0c;200GB月流量&#xff0c;折合每天6.6G流量&#xff0c;地域节点可选上海/广州/北京&#xff0c;…

React Router 6 函数式组件withRouter 路由属性配置

withRouter为解决开发过程中函数组件路由参数获取问题&#xff0c;之前版本的withRouter是直接可以导入使用的&#xff0c;现在的需要手写 这里使用了hooks&#xff0c;获取路由、参数等相关信息 需要在函数式组件内使用props&#xff0c;用法&#xff1a; 1.需要先使用高阶组…

K8s常见面试题20问

K8s常见面试题19问 收集了一些K8s常见问题和同学们面试常被问到的问题. 如果有新的面试题私聊或者留言给我 1. Docker和虚拟机有那些不同 虚拟化环境下每个 VM 是一台完整的计算机&#xff0c;在虚拟化硬件之上运行所有组件&#xff0c;包括其自己的操作系统。 容器之间可以共…

MySQL数据库备份并还原

使用Navicat和命令行备份并恢复数据库 第三方工具备份并恢复步骤1步骤2步骤3步骤4&#xff1a;步骤5 命令行方式备份并恢复&#xff1a;步骤1步骤2步骤3步骤4 第三方工具备份并恢复 步骤1 步骤2 在弹出的窗口上选择要备份的路径&#xff0c;单击保存&#xff0c;下图为备份完…

MySQL与Hadoop数据同步方案:Sqoop与Flume的应用探究【上进小菜猪大数据系列】

&#x1f4ec;&#x1f4ec;我是上进小菜猪&#xff0c;沈工大软件工程专业&#xff0c;爱好敲代码&#xff0c;持续输出干货&#xff0c;欢迎关注。 MySQL与Hadoop数据同步 随着大数据技术的发展&#xff0c;越来越多的企业开始采用分布式系统和云计算技术来处理和存储海量数…

物理机CentOS7.9 安装后无网卡避坑(一) 找不到网卡

1、查看物理网卡 lspci | grep -i ethernet 2、下载网卡驱动 网卡驱动链接 Index of /elrepo/elrepo/el7/x86_64/RPMS (usf.edu) 选择对应版本的驱动 3、使用U盘将下载好的网卡驱动放到新装的机器&#xff0c;任意目录。 4、检查软件安装情况&#xff1a; rpm -qa | gre…

【rust】| 03——语法基础 | 数据类型

系列文章目录 【rust】| 00——开发环境搭建 【rust】| 01——编译并运行第一个rust程序 【rust】| 02——语法基础_变量(不可变?)和常量 【rust】| 03——语法基础 | 数据类型 【rust】| 04——语法基础 | 函数 【rust】| 05——语法基础 | 流程控制 文章目录 前言数据类型1.…

浅析S32K324的时钟树

S32K3XX系列的时钟树梳理 如下图为S32K3XX系列的时钟树图&#xff1a; 一、时钟源 时钟源说明FIRC快速内部RC时钟源SIRC慢速内部RC时钟源FXOSC快速外部晶振时钟源SXOSC慢速外部晶振时钟源 S32K3系列的mcu有4个时钟源如上表。 二、FIRC&#xff08;快速内部RC时钟源&#…

excel中英文互译

在excel运行宏时弹出下面的提示&#xff1a; 无法运行“XXXXX”宏。可能是因为该宏在此工作薄中不可用&#xff0c;或者所有的宏都被禁用的错误提示 解决办法&#xff1a; 1、点击“文件”选项卡&#xff1b; 2、在选项卡界面窗口中选择“选项”按钮&#xff1b; 3、在“选项…

[效率工具] [VS Code] 一文玩转VSCode下的Markdown笔记

简介 Markdown 常用工具 &#xff1a; 各种云笔记优点&#xff1a;云备份,多设备同步&#xff0c;缺点是敏感字&#xff0c;图床不可外链等等。 本地常用IDE又sublime&#xff0c;Typora等等。这样造成本地会安装很多ide。像Typora后期也收费等等。所见所得等等问题&#xff0…

Nacos配置管理、配置热更新、配置共享和搭建nacos集群

目录 1.Nacos配置管理 1.1.统一配置管理 1.1.1.在nacos中添加配置文件 1.1.2.从微服务拉取配置 1.2.配置热更新 1.2.1.方式一 1.2.2.方式二 1.3.配置共享 1&#xff09;添加一个环境共享配置 2&#xff09;在user-service中读取共享配置 3&#xff09;运行两个UserAp…

面向对象【类的实例化与对象内存解析】

文章目录 类的概念对象的概念面向对象的三步骤对象的内存解析JVM 内存结构划分对象内存分析 类的概念 具有相同特征的事物的抽象描述&#xff0c;是抽象的、概念上的定义。 对象的概念 实际存在的该类事物的每个个体&#xff0c;是具体的&#xff0c;因而也称为实例。 面向…

树莓派之人脸识别与智能家居

访问【WRITE-BUG数字空间】_[内附完整源码和文档] 树莓派加上摄像头之后就可以拍照、录视频等各种功能了&#xff0c;这样做一个树莓派相机已经是非常简单的事情了。我们在这里做一个简单的人脸区域检测的功能实验&#xff0c;然后我们在下一个实验让树莓派来控制风扇转动。发…

电机转矩、功率、转速之间的关系及计算公式

电机转矩、功率、转速之间的关系及计算公式 REF 电机功率和转矩、转速之间的关系 - 知乎 电机转矩、功率、转速、电压、电流之间关系及计算公式 - 豆丁网 电机转矩、功率、转速、电压、电流之间关系及计算公式 - 豆丁网 【技术】电动机功率、转速、扭矩的关系 实际上应该是…

系统分析师之项目管理(十七)

一、范围管理 范围管理&#xff1a;确定项目的边界&#xff0c;即哪些工作是项目应该做的&#xff0c;哪些工作不应该包括在项目中。 二、时间管理 时间管理&#xff1a;也叫进度管理&#xff0c;就是用科学的方法&#xff0c;确定目标进度&#xff0c;编制进度计划和资源供应计…

第十章 聚类算法

聚类算法 算法概括聚类&#xff08;clustering&#xff09;聚类的概念聚类的要求聚类与分类的区别 常见算法分类聚类算法中存在的问题 距离度量闵可夫斯基距离欧式距离&#xff08;欧几里得距离&#xff09;曼哈顿距离切比雪夫距离皮尔逊相关系数余弦相似度杰卡德相似系数 划分…