蓝桥杯备赛:顺序表和单链表相关算法题详解(上)

server/2025/1/16 10:19:17/

目录

一.询问学号(顺序表)

1.题目来源:

2.解析与代码实现:

(1)解析:

(2)代码实现:

二.寄包柜(顺序表)

1.题目来源:

2.解析与代码实现:

(1)解析:

(2)具体代码:

三.快慢指针(单链表)

1.反转链表:

主要思路:三指针法

2.回文结构:

主要思路:快慢指针和三指针反转

四.交叉链表

1.题目:

2.解析与代码实现:


一.询问学号(顺序表)

1.题目来源:

https://www.luogu.com.cn/problem/P3156

(洛谷原题)

2.解析与代码实现:

(1)解析:

首先结合题目和输出样例不难看出这道题目是围绕两个变量:学生个数n和询问次数m,分别代表着第二行和第三行输入数据的个数,因此n和m就非常容易地可以作为接下来我们实现代码里的范围参数,因为当我们在一串数字(这里也就是顺序表)里查找某一个给定的数字就免不了要去遍历这传数字(顺序表)因此就需要这串数字的数字个数来作为遍历循环的范围条件乃至于通过对其减少以便将其作为判断循环是否结束的条件,所以这题的代码思路就很容易可以得到了:首先确定需要我们输入的变量有三行:第一行的n和m,第二行的n个数字,第三行的m个数字,因此就会产生两个循环,然后就是在这两个循环里分别实现数组的输入和指定数组成员的输出就行了

(2)代码实现:
#include<iostream>
#include<vector>using namespace std;const int N = 2e6 ;//定义一下学生的最大个数int n, m;//定义全局变量m,n
vector<int>a(N);//创建一个变长数组aint main()
{//初始化数组(即使用户输入题目里第二行的数组成员)cin >> n >> m;for (int q = 0; q < n; q++){cin >> a[q];}//根据用户输入的序号(第三行)查找上面的数组的特定元素while (m--){int p;cin >> p;cout << a[p] << endl;}return 0;
}

二.寄包柜(顺序表)

1.题目来源:

https://www.luogu.com.cn/problem/P3613

(洛谷原题)

2.解析与代码实现:

(1)解析:

这题粗略浏览下来会感觉有些麻烦,但多读几遍其实也不是非常难以理解,简单来说,这题有以下几个参数:寄包柜个数n,询问次数q,第i个柜子,第j个格子以及存入操作(1),查看操作(2),代码大概实现思路就是通过变长数组(vector)进行存入操作,然后再对用户的输入来判断查找还是存入,最后通过数组访问读取即可,并且存入时再多关注一下空间是否充裕,不够的话用resize扩容即可

(2)具体代码:
#include<iostream>
#include<vector>
using namespace std;const int N = 1e5 + 10;//单纯为了防止空间不够而多加了10个空间vector<int>abc[N];//创建N个柜子int n, q;//创建全局变量
int main()
{cin >> n >> q;while(q--){int option, i, j, k;cin >> option >> i >> j;//存入if (option == 1){cin >> k;//判断空间是否充足if (abc[i].size() <= j){//扩容abc[i].resize(j + 1);}abc[i][j] = k;}else{//查询cout << abc[i][j] << endl;}}return 0;
}

代码这里有一点值得关注一下就是为啥一定要使用vector变长数组而不使用一般的二维数组,如果我使用普通的二维数组:abc[N][N],那这里就相当于要开辟N*2个柜子,而这是与题目要求范围相悖的


三.快慢指针(单链表)

1.反转链表:

原题链接:https://leetcode.cn/problems/reverse-linked-list/description/

主要思路:三指针法

通过三个指针的循环往后移动并在移动过程中改变每一个结点指向从而实现在遍历链表后实现所有结点之间指针方向的改变,同时需要注意的就是在循环的最后,n2和n3指针都指向NULL

#include<stdio.h>struct ListNode 
{int val;struct ListNode* next;
};typedef struct ListNode ListNode;struct ListNode* reverseList(struct ListNode* head) 
{if (head == NULL){return head;}ListNode* n1, *n2, *n3;n1 = NULL, n2 = head, n3 = n2->next;while (n2){n2->next = n1;//改变链表结点之间的指针指向n1 = n2;n2 = n3;if (n3){n3 = n3->next;}}//跳出循环说明此时n2(n3也是)为空return n1;
}

2.回文结构:

原题链接:https://www.nowcoder.com/practice/d281619e4b3e4a60a2cc66ea32855bfa

主要思路:快慢指针和三指针反转

具体思路主要就是先通过快慢指针找到回文结构的中间位置,然后反转链表并将其与原链表进行遍历比较,如果一样就是回文结构,但这道题其实还有个小漏洞,就是因为题目在限制范围后我们其实就可以讲链表里的数据遍历载入一个数组中然后分别再从头尾进行遍历比较,这是一种钻空子的做法,但就此题来说也不是不行

#include<stdio.h>struct ListNode 
{int val;struct ListNode* next;
};typedef struct ListNode ListNode;//找中间结点
ListNode* middleNode(ListNode* head)
{//创建快慢指针ListNode* fast, * slow;head = fast = slow;if (fast && fast->next)//注意两者顺序不可以颠倒{slow = slow->next;fast = fast->next->next;}return slow;
}//反转链表
ListNode* reverseList(ListNode* head)
{if (head == NULL){return NULL;}ListNode* n1, * n2, * n3;n1 = NULL, n2 = head, n3 = n2->next;n2->next = n1;n1 = n2;n2 = n3;if (n3){n3 = n3->next;}return n1;
}
bool checkpa(ListNode* A)
{//1.找中间结点ListNode* mid = middleNode(A);//2.反转中间结点作为另外一个头的链表ListNode* right = reverseList(mid);//3.遍历原链表和反转之后的链表,比较结点的值是否相同ListNode* left = A;//此时反转后的链表指向空,但原链表依旧往后延续,可以参考下图while (right){if (left->val != right->val){return false;}left = left->next;right = right->next;}return true;
}


四.交叉链表

1.题目:

原题来源:https://leetcode.cn/problems/intersection-of-two-linked-lists/description/

2.解析与代码实现:

这题相比上面的思路就要显得更加简洁,浏览题目易得这题的主要着手点就在于两条链表重合前是否长度相等,因此就可以通过先分别计算出两条链表的长度然后使长链表先走掉比短的那条链表多出来的的长度差,然后再依次遍历比较即可

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* getIntersectionNode(struct ListNode* headA, struct ListNode* headB)
{//先求两条链表的长度ListNode* pa = headA;ListNode* pb = headB;int sizeA = 0, sizeB = 0;while (pa){++sizeA;pa = pa->next;}while (pb){++sizeB;pb = pb->next;}int gap = abs(sizeA - sizeB);//abs函数求绝对值//让长链表先走gap步ListNode* longlist = headB;ListNode* shortlist = headA;if (sizeA < sizeB){shortlist = headB;longlist = headA;}while (gap--){longlist = longlist->next;}//此时长短链表处于同一起跑线while (shortlist){if (shortlist == longlist){return longlist;}shortlist = shortlist->next;longlist = longlist->next;}return NULL;
}

以上就是我在这篇文章里想写的几道题目的全部了

全文终


http://www.ppmy.cn/server/158799.html

相关文章

【精选】基于EfficientViT优化YOLOv8的智能车辆识别系统设计 车辆颜色分类与车牌检测、深度学习目标检测系统开发

博主介绍&#xff1a; ✌我是阿龙&#xff0c;一名专注于Java技术领域的程序员&#xff0c;全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师&#xff0c;我在计算机毕业设计开发方面积累了丰富的经验。同时&#xff0c;我也是掘金、华为云、阿里云、InfoQ等平台…

Linux下源码编译安装Nginx1.24及服务脚本实战

1、下载Nginx [rootlocalhost ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz2、解压 [rootlocalhost ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/3、安装依赖 [rootlocalhost ~]# yum install gcc gcc-c make pcre-devel openssl-devel -y4、 准备 N…

提问:玩游戏输入法总弹出来咋回事哎

玩游戏时输入法总弹出来的问题&#xff0c;通常与电脑的输入法设置、操作系统配置以及游戏程序的兼容性有关。以下是一些常见的解决方法&#xff1a; 一、修改输入法快捷键 禁用不必要的输入法&#xff1a; 在系统的语言设置中&#xff0c;暂时禁用非活动的输入法&#xff0c;…

【漏洞复现】中科网威-anysec安全网关 arping 远程命令执行漏洞复现(CNVD-2024-46119)

免责声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任。工具来自网络,安全性自测,如有侵权请联系删除。本次测试仅供学习使用,如若非法他用,与平台和本文作…

C#,图片分层(Layer Bitmap)绘制,反色、高斯模糊及凹凸贴图等处理的高速算法与源程序

1 图像反色Invert 对图像处理的过程中会遇到一些场景需要将图片反色&#xff0c;反色就是取像素的互补色&#xff0c;比如当前像素是0X00FFFF&#xff0c;对其取反色就是0XFFFFFF – 0X00FFFF 0XFF0000&#xff0c;依次对图像中的每个像素这样做&#xff0c;最后得到的就是原…

lua下标是可以从0开始

故事背景&#xff0c;策划搞了一个功能配置表&#xff0c;我看居然是0开始的&#xff0c;功能也正常。于是测试了下&#xff0c;还真的可以。网上看了资料确实可以&#xff0c;但是也有需要注意的问题 local test {[0] 0} for k,v in pairs(test)doprint(k,v) endhttps://bl…

在AI智能中有几种重要的神经网络类型?6种重要的神经网络类型分享!

神经网络今天已经变得非常流行&#xff0c;但仍然缺乏对它们的了解。一方面&#xff0c;我们已经看到很多人无法识别各种类型的神经网络及其解决的问题&#xff0c;更不用说区分它们中的每一个了。其次&#xff0c;在某种程度上更糟糕的是&#xff0c;当人们在谈论任何神经网络…

Type-C双屏显示器方案

在数字化时代&#xff0c;高效的信息处理和视觉体验已成为我们日常生活和工作的关键需求。随着科技的进步&#xff0c;一款结合了便携性和高效视觉输出的设备——双屏便携屏&#xff0c;逐渐崭露头角&#xff0c;成为追求高效工作和娱乐体验人群的新宠。本文将深入探讨双屏便携…