408强化(二)线性表纯享版
目录
一、顺序表(数组)和链表总览
二、考情分析
2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况:
2.2 没有考过的地方
三、 共同操作或考法
3.1 多指针后移
3.2 逆置
3.3 空间换时间的操作
3.4 只保留首次出现的元素(共同考法)
3.4 排序
四、独有操作或考法
4.1 在顺序表中遍历,找到符合要求的元素并删除
4.2 判断单链表是否存在环
4.3 找到两个链表中的共同结点


红色字体为线性表的共同操作, 蓝色背景为下文有模板。绿色字体为统计的考频分析(易想到不饶弯子的)
一、顺序表(数组)和链表总览
第一步:看到题目,分析情况
- 多指针后移 2010较优解; 2020年最优解(三指针)
- 以空间换时间 2018
- 排序或排序后利于操作 2013较优解; 2016暴力解
- 逆置 2010最优解(三次逆置)
- 折半查找 2011最优解
- 删除、插入
- 只保留首次出现的元素
第二步:分析坑
- 表长是奇数或偶数时需讨论
- 空表怎么处理
第一步:看到题目,分析情况
- 多指针后移
- 以空间换时间 2015
- 排序
- 头插法逆置 2019
- 前后指针 2012最优解
- 快慢指针
- 只保留首次出现的元素
第二步:分析坑
- 头插法是逆序建立链表,尾插法是正序建立链表
- 单链表只能向后查找,故可能需要前驱指针
- 不可修改链表结构
- 有free()操作
- 需malloc()结点
- 注意是否有头结点
- 不同于数组改变下标,链表是p=p->next,本质一样
二、考情分析
2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况:
- 升级版。2011年能用二指针后移,2020年需要设置三指针后移。
- 数组考过,换到链表考。如2015年和2018年都是以空间换时间
- 太过重要。如快排,是某一年的解的一部分。2013年是较优解,2016年是暴力解。
2.2 没有考过的地方
数组的插入删除;链表的多指针后移;不使用数组进行链表排序。都具有很大的考察可能。
2021,2022,2023年为图,二叉树,图。2018,2019,2020年都是线性表,2024年很可能回归线性表。
三、 共同操作或考法
3.1多指针后移
条件:多个线性表;有序。
- 归并链表或数组,使之有序。
- 归并的升级操作:找到两个序列中的相同元素或其他,本质仍是比大小,改变的是比的内容或对结果的操作。
多指针后移常用于有序线性表(顺序表和链表都可以),如果考试中给出有序的线性表,优先考虑这种方式,这种方式可以用于合并多个有序线性表、查找共同排序后第k个大小的元素等等,归并排序就是用到了这种思想。
归并两个升序数组
void Merge(int A[], n, B[], m){ //数组A、B长度分别为n、mint C[n+m]; //新数组int pa=pb=k=0; //pa、pb作为遍历A、B的下标while (pa<n && pb<m) //直到有一个数组遍历完if (A[pa]<B[pb]) //将小的那个数存入C数组C[k++]=A[pa++];else C[k++]=B[pb++];for (; pa<n; i++)C[k++]=A[pa]; //将A中剩余的数存入C数组for (; pb<m; j++)C[k++]=B[pb]; //将B中剩余的数存入C数组 }归并两个升序链表,结果存放在LA中,使之降序。
void MergeList (LinkList &La,LinkList &Lb){ LNode *pa=La->next,*pb=Lb->next; //分别是工作指针 LNode *r;//头插法防止断链需要的指针 La->next=NULL; //结果链表初始化为空 while(pa!=NULL&&pb!=NULL) if(pa->data<=pb->data){ r=pa->next; //r暂存pa的后继指针 pa->next=La->next; La->next=pa; pa=r; //恢复pa为当前待比较结点 } else{ r=pb->next; //r暂存pb的后继指针 pb->next=La->next; La->next=pb; pb=r; //恢复pb为当前待比较结点 } if(pa!=NULL) pb=pa //pa不空的将原La剩余元素继续前插进结果链表La,这里用到了一个小技巧 while(pb!=NULL){ //pb不空的话将Lb剩余元素继续前插进结果链表La r=pb->next; pb->next=La->next; La->next=pb; pb=r; } free(Lb); //将最后只剩下的一个Lb头结点free掉 }归并两个升序链表,结果存放在LA中,使之升序
void Merge(LinkList *La, *Lb){ LNode *pa=La->next, *pb=Lb->next; //pa、pb指向L1、L2第一个元素LNode *r=La; //新链表头节点为La,r指向末尾LNode *par, *pbr; //用来暂存pa->next和pb->nextwhile (pa!=null && pb!=null) //直到有一个链表遍历完if (pa->data<pb->data){ //将小的那个数存入新链par=p->next; //par为pa下一个元素r->next=pa; //pa插入到r后面pa->next=NULL; //这是新链最后一个元素r=pa; //尾指针r指向最后一个元素pa=par; //pa指向pa下一个元素}else{ pbr=pb->next; //pbr为pb下一个元素r->next=pb; //pb插入到r后面pb->next=NULL; //这是新链最后一个元素r=pb; //尾指针r指向最后一个元素pb=pbr; //pb指向pb下一个元素}if (pa!=null)r->next=pa; //将剩余部分连到r后面if (pb!=null)r->next=pb; //将剩余部分连到r后面//La是合并后的升序链表,注意最后此时r已经不是指向新链表尾元素的指针了
3.2逆置
顺序表
数组可以任意下标到任意下表逆置
void Reverse(int low,int high,Sqlist *L){ElemType temp; //用于暂存for(int i=0;i<(high-low+1)/2;i++){//注意边界条件,交换对应位置元素temp=L.data[low];L.data[low]=L.data[high];L.data[high]=temp;}}链表
链表用头插法逆置
LinkList Reverse(LinkList L){LNode *p,*r; //p为工作指针,r为p的后继结点指针p=L->next;L->next=NULL; //先断开头结点while(p!=NULL){ r=p->next;p->next=L->next; L->next=p; //将p结点插入到头结点后,第一个结点插入时即为尾结点p=r; //工作指针后移}return L;}
3.3 空间换时间的操作
空间保存状态。原序列最多只有n种情况,设置一个大小为n,初始值为0的数组A[n-1]用于保存这些情况。遍历一遍序列将出现的情况对于的数组置1。
3.4 只保留首次出现的元素(共同考法)
顺序表课后第06题
链表课后第12题
3.4 排序
传统数组排序
快速排序的平均时间复杂度是O(nlogn),平均空间复杂度是O(logn),是考试中最快的不稳定排序算法,一般要用到排序时都使用快速排序。快速排序的最坏时间复杂度是O(n2),最坏空间复杂度都是O(n),但我们只需要加一个小优化就能避免最坏情况:即随机选择一个元素作为枢值。优化后最坏时间复杂度O(nlogn),最坏空间复杂度O(logn)。
(注:快速排序有很多写法,交换式和挖坑式,不同写法中间过程不一样但只要能实现排序即可,本代码适用于算法大题,方便记忆)
代码如下:void Qsort(int A[], L, R){ //a数组保存数据,L和R是边界if (L>=R) return; //当前区间元素个数<=1则退出int pivot, i=L, j=R; //i和j是左右两个数组下标移动把A[L~R]中随机一个元素和A[L]交换 //快排优化,使得基准值的选取随机pivot=A[L]; //pivot作为基准值参与比较while (i<j){while (i<j && A[j]>pivot)j--;while (i<j && A[i]<=pivot)i++;Rif (i<j)swap(A[i], A[j]); //交换A[i]和A[j]}swap(A[L], A[i]); //将基准值放入他的最终位置 /*此时A[L~i-1]<=A[i]<=A[i+1~R]*/Qsort(A, L, i-1); //递归处理左区间Qsort(A, i+1, R); //递归处理右区间}单链表排序
- 使用O(n)大小的辅助数组,进而可以使用第7章的排序算法,最后重置链表的结点数据域。
- 直接插入排序思想,代码如下:
void Sort(LinkList &L){LNode *p=L->next,*pre;LNode *r=p->next;p->next=NULL; //构造只含一个数据结点的有序表p=r;while(p!=NULL){ //每次插入一个结点并使链表有序r=p->next;pre=L; //将pre置于头结点,用于循环找到插入的合适位置while(pre->next!=NULL&&pre->next->data<p->data) pre=pre->next;p->next=pre->next; pre->next=p; //将*p插入到*pre之后p=r; //工作指针迭代}//第一个while}//void
四、独有操作或考法
4.1 在顺序表中遍历,找到符合要求的元素并删除
两种方法
- 用count记录已保存的元素个数,遍历时将需要保存的元素移动到下标count的位置,并更新count值
- 用count记录已删除的元素个数,遍历时更新count,或者将需要保留的元素前移count
两种方法结束后都要修改L.length
- L.length=count;
- L.length-=count;
4.2 判断单链表是否存在环
如果有环,快指针早晚追上慢指针
课后21题
4.3 找到两个链表中的共同结点
1)对齐后(前后指针),同时扫描两链表
2)for循环枚举
咸鱼学长统计,我在这里保存一下方便查看


相关文章:
408强化(二)线性表纯享版
目录 一、顺序表(数组)和链表总览 二、考情分析 2.1 从历年考情可以看出,如果一个方法出现了第2次,一般是以下情况: 2.2 没有考过的地方 三、 共同操作或考法 3.1 多指针后移 3.2 逆置 3.3 空间换时间的操作 3.…...
ubuntu下如何使用wireshark抓包,保姆级教程
Wireshark(前称Ethereal)是一个网络封包分析软件。网络封包分析软件的功能是截取网络封包,并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换。 一、安装wireshark 打开终端&…...
世界上最健康的程序员作息表!「值得一看」
昨晚看了一篇“传说中”的“世界上最健康的作息时间表”,开始纠结自己还要不要5点半起床。 都说程序员这一行,猝死概率极高,究其原因还是加班太狠、作息不规律、缺乏运动… 今天和大家分享一下这篇文章,还是非常值得参考的&#…...
Java中多继承的实现
1 问题Java是一种面向对象的只允许单继承的语言,那么怎样在Java中实现多继承呢?2 方法多层继承如果要直接继承类,子类是不可以直接多继承的,但是可以通过多层继承来实现多继承,但多层继承一般不建议超过三次。接口接口…...
蓝桥杯 stm32 USART 串口发送数据
文章代码使用 HAL 库。 文章目录 前言一、串口原理图二、CubeMX 创建工程。三、串口发送函数:四、串口助手 配置:五、详细代码:注意:连续发送数据六、printf 重定向问题代码示例:实验效果:总结前言 USART : ( Universal Synchronous/Asynchronous Receiver/Transmitter…...
Spring之AOP底层源码解析
Spring之AOP底层源码解析 1、动态代理 代理模式的解释:为其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。 举个例子 public class UserService {public void test() {System.out.println("test.…...
人脸识别——景联文科技提供3D头模数据采集业务!
“拿起手机刷脸解锁、上下班考勤、支付订单,刷脸已极大地便利了我们的生活。清华大学新闻学院教授沈阳表示,中国人平均每天要暴露在各种摄像头下超过500次。人脸识别已成了我们生活中重要的一部分。由于2D人脸识别容易受到姿态、表情、光照等因素影响&am…...
SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka
最近做的一个项目,使用的是pg数据库,公司没有成熟的DCD组件,为了实现数据变更消息发布的功能,我使用SpringBoot集成Flink-CDC 采集PostgreSQL变更数据发布到Kafka。 一、业务价值 监听数据变化,进行异步通知…...
酷开系统壁纸模式,将氛围感死死拿捏!
古希腊哲学家柏拉图曾经说过:“美感是起于视觉、听觉产生的快感,以人的感官所能达到的范围为极限。”而电视则恰恰就是视觉听觉的完美融合体,当一台开启的电视可以给我们带来视听享受的时候,一台待机状态下的电视又如何取悦于我们…...
第0章 一些你可能正感到迷惑的问题
操作系统是什么 操作系统是控制管理计算机系统的硬软件,分配调度资源的系统软件。 由操作系统把资源获取到后台给用户进程,但为了保护计算机系统不被损坏,不允许用户进程直接访问硬件资源。 操作系统相当于是一个分配资源的机构,…...
MYSQL实战
SQL的处理 缓存解析查询优化(查询优化器) 重写查询;表的读取顺序;选择索引1.不要在索引上做任何操作 表达式函数 2.尽量全值匹配 联合索引中搜素条件后会根据最优条件排序进行查询,联合索引尽量都使用起来。搜索条…...
少儿户外拓展北斗定位解决方案
一、项目背景户外拓展训练是指通过专业的机构,对久居城市的人进行的一种野外生存训练。拓展训练通常利用崇山峻岭、翰海大川等自然环境,通过精心设计的活动达到“磨练意志、陶冶情操、完善人格、熔炼团队”的培训目的。针对户外拓展人员安全管理存在的实…...
更换ssl证书
更换ssl证书常用证书查看以及转换网址阿里云判断流量以及配置证书判断接入点阿里云控制台配置证书WAFAzure判断流量以及配置证书:判断接入点Azure配置证书CDNAPP GateWay常用证书查看以及转换网址 https://www.chinassl.net/ssltools/convert-ssl.htmlhttps://myss…...
线程池源码解析项目中如何配置线程池
目录 基础回顾 线程池执行任务流程 简单使用 构造函数 execute方法 execute中出现的ctl属性 execute中出现的addWorker方法 addWorker中出现的addWorkerFailed方法 addWorker中出现的Worker类 Worker类中run方法出现的runWorker方法 runWorker中出现的getTask runWo…...
Echarts 更改K线度颜色,解释K线图4个数字意义
第019个点击查看专栏目录本示例修改K线度的颜色,方法参考源代码。 这里面讲一下K线图的四个数字,如[20, 34, 10, 38], 第一位:20代表开盘价格, 第二位:34代表闭盘价格, 第三位:10代表最低价&…...
JavaScript和Java两种方法实现百度地图和高德、腾讯地图的相互转换
目录一、常见的经纬度标准二、百度地图和高德、腾讯地图经纬度的转换1、前端JavaScript转换2、后端Java实现转换一、常见的经纬度标准 高德、腾讯(使用GCJ02) GCJ-02坐标系,也称火星坐标系,由中国国家测绘局在02年发布࿰…...
Vue中常见的几种组件间通信方法
1.props(父传子) 父组件Parent.vue <template><child :msg"message"></child> </template>父组件通过:val"value"的形式定义要传给子组件的值value绑定到val上 子组件Child.vue export default {//写法一…...
Outcome VS. Output:研发效能提升中,谁会更胜一筹?
2007 年,网景通信公司(Netscape)的联合创始人 Marc Andreessen 在博客 The Pmarca Guide to Startups 中提出 「Product/Market Fit」 ,他写道, 「这意味着在一个良好的市场中,拥有能够满足该市场的产品。」…...
ptp4l与phc2sys进行系统时钟同步
linuxptp用于时钟同步。安装采用apt install linuxptp主要包含2个程序,ptp4l 进行时钟同步,实时网卡时钟与远端的时钟同步,支持1588 和 802.1AS 两种协议phc2sys 将网卡上的时钟同步到操作系统,或者反之命令demo:某主机P通过eth2连…...
使用注解JSON序列化
JsonSerialize(using ToStringSerializer.class) 将返回数据转成String序列化 JsonFormat(pattern "yyyy-MM-dd hh:mm",timezone"GMT8") 将日期数据转换成特定格式 使用JsonSerialize自定义注解接口 定义接口 import java.lang.annotation.ElementTyp…...
<6>-MySQL表的增删查改
目录 一,create(创建表) 二,retrieve(查询表) 1,select列 2,where条件 三,update(更新表) 四,delete(删除表…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
JS设计模式(4):观察者模式
JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中࿰…...
Java编程之桥接模式
定义 桥接模式(Bridge Pattern)属于结构型设计模式,它的核心意图是将抽象部分与实现部分分离,使它们可以独立地变化。这种模式通过组合关系来替代继承关系,从而降低了抽象和实现这两个可变维度之间的耦合度。 用例子…...
