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…...
【杂谈】-递归进化:人工智能的自我改进与监管挑战
递归进化:人工智能的自我改进与监管挑战 文章目录 递归进化:人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管?3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
MFC内存泄露
1、泄露代码示例 void X::SetApplicationBtn() {CMFCRibbonApplicationButton* pBtn GetApplicationButton();// 获取 Ribbon Bar 指针// 创建自定义按钮CCustomRibbonAppButton* pCustomButton new CCustomRibbonAppButton();pCustomButton->SetImage(IDB_BITMAP_Jdp26)…...
【2025年】解决Burpsuite抓不到https包的问题
环境:windows11 burpsuite:2025.5 在抓取https网站时,burpsuite抓取不到https数据包,只显示: 解决该问题只需如下三个步骤: 1、浏览器中访问 http://burp 2、下载 CA certificate 证书 3、在设置--隐私与安全--…...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
保姆级教程:在无网络无显卡的Windows电脑的vscode本地部署deepseek
文章目录 1 前言2 部署流程2.1 准备工作2.2 Ollama2.2.1 使用有网络的电脑下载Ollama2.2.2 安装Ollama(有网络的电脑)2.2.3 安装Ollama(无网络的电脑)2.2.4 安装验证2.2.5 修改大模型安装位置2.2.6 下载Deepseek模型 2.3 将deepse…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
