静态链表具体题目处理详解

题目

给出两条链表的首地址以及若干结点的地址、数据、下一个结点的地址,求两条链表的首个共用结点的地址。如果两条链表没有共用结点,则输出-1.

思路

(1)由于地址的范围很小,因此可以直接用静态链表,但是依照题目的要求,在结点的结构体中再定义一个int型变量flag,表示结点是否在第一条链表中出现,是则为1,不是为-1.

(2)由题目给出的第一条链表的首地址出发遍历第一条链表,将经过的所有结点的flag值赋为1.

接下来枚举第二条链表,当出现第一个flag值为1的结点,说明第一条链表中出现过的结果,即为两条链表的第一个共用结点。如果第二条链表枚举完仍然没有发现共用结点,则输出-1.

注意点

(1)使用%05d格式输出地址,可以使不足5位的整数的高位补0;

(2)使用map容易超时

(3)scanf使用%c格式时是可以读入空格的,因此在输入地址、数据、后继结点地址时。格式不能写成%d%c%d,必须在中间加空格。

#include<cstdio>
#include<cstring>
const int maxn=100010;
struct node{char data;int next;bool flag;
}node[maxn];
int main(){for(int i=0;i<maxn;i++){node[i].flag=false;}int s1,s2,n;scanf("%d%d%d",&s1,&s2,&n);int address,next;char data;for(int i=0;i<n;i++){scanf("%d %c %d",&address,&data,&next);node[address].data=data;node[address].next=next;}int p;for(p=s1;p!=-1;p=node[p].next){node[p].flag=true;}for(p=s2;p!=-1;p=node[p].next){if(node[p].flag==true){break;}}if(p!=-1){printf("%05d\n",p);}else{printf("-1\n");}return 0;
}

以上是静态链表所能解决的比较简单的题,而对一些稍微复杂的题,此处归纳出了一类问题的通用解题步骤。

(1)定义静态链表

struct node{int address;//结点地址typename data;int next;xxxx;//结点的某个性质,不同的题目会有不同的设置 
}node[100010];

(2)在程序的开始,对静态链表进行初始化,一般来说,需要对定义中的XXXX进行初始化,将其定义为正常情况下达不到的数字(一般来说,需要小于所有能达到的数字)。例如对结点是否在链表上这个性质来说,我们可以初始化为0,表示结点不在链表上。

for(int i=0;i<maxn;i++){node[i].XXXX=0;
}

(3)题目一般都会给出一条链表的首结点的地址,那么我们就可以依据这个地址来遍历得到整条链表。需要注意的是,这一步同时也是我们对结点的性质XXXX进行标记、并且对有效结点的个数进行计数的时候,例如对结点是否在链表上这个性质来说,当我们遍历链表时,就可以把XXXX置为1.

int p=begin,count=;
while(p!=-1){XXXX=1;count++;p=node[p]->next;
}

(4)由于使用静态链表时,是直接采用地址映射(hash)的方式,这就会使得数组下标的不连续,而很多时候题目给出的结点并不都是有效结点(即可能存在不在链表上的结点)。为了能够可控地访问有效结点,一般都需要用对数组进行排序以把有效结点移到数组左端,这样就可以用步骤3得到的count来访问它们。

既然需要把有效结点移到前面,那么就可以用之前定义的XXXX来帮忙。在步骤2中,XXXX需要被初始化为比正常结点的XXXX取值更小的数值,这个做法就可以在这一步起到作用。

由于无效结点的XXXX在步骤3中不会被修改,因此一定比有效结点的XXXX小。于是在写sort的排序函数cmp时,就可以在cmp的两个参数结点中有无效结点时按XXXX从大到小排序。这样就可以把有效结点全部移到数组左端。

一般来说,题目一定会有额外的要求,因此cmp函数中一般都需要有第二级排序,不过这需要以不同的题目要求来确定。例如,如果题目的要求需要把链表的按结点顺序排序,就需要在cmp函数中建立第二级排序,即在cmp的两个参数结点中有无效结点时按XXXX从大到小排序,而当两个参数结点都是有效结点时按结点在链表中的位置从大到小排序(结点的顺序可以在第三步得到)

bool cmp(node a,node b){if(a.XXXX==-1||b.XXXX==-1){return a.XXXX>b.XXXX;}else{//第二级排序 }
}

(5)在经历了步骤4后,链表中的有效结点就都在数组左端了,且已经按结点的性质进行排序,接下来就要看题目在排序之后具体要求做什么了。

题目运用

给出N个结点的地址address,数据域data以及指针域next,然后给出链表的首地址,要求把在这个链表上的结点按data值从小到大输出。

思路

此题目可以直接套用上面的解题步骤

(1)定义静态链表,其中结点性质由bool型变量flag定义,表示为结点在链表中是否出现。flag为false表示无效结点(不在链表上的结点)

(2)初始化,令flag均为false,表示初始状态下所有结点都是无效结点。

(3)由题目给出的链表的首地址begin遍历整条链表,并标记有效结点的flag为true,同时计数有效结点的个数count。

(4)对结点及逆行排序,排序函数cmp的排序原则是:如果cmp的两个参数结点中有无效结点的话,则按flag从大到小排序,以把有效结点排在数组左端(因为有效结点的flag为1,大于无效结点的flag)。否则按数据域从小到大排序。

(5)由于有效结点已经按照数据域从小到大排序,因此按要求输出有效结点即可。

注意点

(1)可以直接使用%05d的输出格式,以在不足五位时在高位补0。但是要注意-1不能使用%05d输出,否则会输出-0001(而不是-1或者-00001),因此必须留意-1的输出。

(2)题目可能会有无效结点,即不在题目给出的首地址开始的链表上。

(3)数据里面还有均为无效的情况,这时就要根据有效结点的个数特判输出“0 -1”

#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=100005;
struct Node{int address,data,next;bool flag;
}node[maxn];
bool cmp(Node a,Node b){if(a.flag==false||b.flag==false){return a.flag>b.flag;}else{return a.data<b.data;}
} 
int main(){for(int i=0;i<maxn;i++){node[i].flag=false;}int n,begin,address;scanf("%d%d",&n,&begin);for(int i=0;i<n;i++){scanf("%d",&address);scanf("%d%d",&node[address].data,&node[address].next);node[address].address=address;}int count=0,p=begin;while(p!=-1){node[p].flag=true;count++;p=node[p].next;}if(count==0){printf("0 -1");}else{sort(node,node+maxn,cmp);//防止-1被%05d化,提前判断 printf("%d %05d\n",count,node[0].address);for(int i=0;i<count;i++){if(i!=count-1){printf("%05d %d %05d\n",node[i].address,node[i].data,node[i+1].address);}else{printf("%05d %d -1\n",node[i].address,node[i].data);}}}return 0;
}

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

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

相关文章

计算机视觉与模式识别实验1-1 图像的直方图平衡

文章目录 &#x1f9e1;&#x1f9e1;实验流程&#x1f9e1;&#x1f9e1;1.读入图像‘rice.png’&#xff0c;在一个窗口中显示灰度级n64&#xff0c;128和256的图像直方图。2.调解图像灰度范围&#xff0c;观察变换后的图像及其直方图的变化。3.分别对图像‘pout.tif’和‘ti…

③单细胞学习-pbmc的Seurat 流程

目录 1&#xff0c;数据读取 2&#xff0c;线粒体基因查看 3&#xff0c;数据标准化 4&#xff0c;识别高变基因 5&#xff0c;进行数据归一化 6&#xff0c;进行线性降维 7&#xff0c;确定细胞簇 8&#xff0c;UMAP/tSNE降维&#xff08;保存pbmc_tutorial.rds&#…

mirth Connect 自定义JAVA_HOME

mirth Connect 自定义JAVA_HOME 1、背景 服务器上安装了两个不同版本的Java&#xff0c;我希望Mirth服务使用与默认系统不同的版本。自定义指定java版本 2、解决方法 2.1 优先级说明 系统变量JAVA_HOME (设置后&#xff0c;mirth会根据这个进行启动运行服务&#xff0c;优先级…

【火炬打宝策略】

打宝策略刷遗物&#xff1a; 时可4 只刷奇诊加稀有度&#xff0c;没有奇诊可以直接不打。

模型 STORY评估框架

说明&#xff1a;系列文章 分享 模型&#xff0c;了解更多&#x1f449; 模型_思维模型目录。故事五要素&#xff1a;结构、时间、观点、现实、收益 。 1 STORY评估框架的应用 1.1 STORY模型展示其个性化在线学习解决方案的优势 一家在线教育平台想要通过一个故事来展示其个性…

不是我愿意孤独,而是周围找不到同类

概述 首先&#xff0c;听到这句话的时候&#xff0c;是从《天道》的电视剧中听到的。 仔细翻阅后&#xff0c;发现&#xff0c;这句话出自尼采。 完整的表述是&#xff1a;独处的人不是因为他想孤独&#xff0c;而是因为在他的周围找不到他的同类~ 先不说是不是真有此句&…

gcc 内建函数示例 __builtin_return_address

1,理论未动&#xff0c;示例先行 hello_gcc_callstack.c #include <stdio.h>void do_backtrace() {void *pc0 __builtin_return_address(0);void *pc1 __builtin_return_address(1);void *pc2 __builtin_return_address(2);void *pc3 __builtin_return_address(3);…

【工具】Docker安装Jenkins并部署Java项目

【工具】Docker安装Jenkins并部署Java项目 文章目录 【工具】Docker安装Jenkins并部署Java项目1. 前置条件2. 安装3. 创建项目3.1 配置Maven3.2 构建项目3.3 自动部署 1. 前置条件 准备一台云服务器或本地虚拟机&#xff0c;保证必须要java环境&#xff0c;一键安装jdk&#x…

Spring 框架:Java 企业级开发的基石

文章目录 序言Spring 框架的核心概念Spring 框架的主要模块Spring Boot&#xff1a;简化 Spring 开发Spring Cloud&#xff1a;构建微服务架构实际案例分析结论 序言 Spring 框架自 2002 年发布以来&#xff0c;已经成为 Java 企业级开发的标准之一。它通过提供全面的基础设施…

相机等效焦距

1. 背景 物理焦距我们很熟悉,但是在接触实际的相机参数时,相机厂家会提到一个参数等效焦距,甚至有时候不提供物理焦距,这时候如果我们得到真实的物理焦距需要进行一定的转换.在介绍两者之间的转换关系前,先介绍一下等效焦距的由来. 如上图,假设在某一个镜头,其成像面会出现图…

C++ vector的使用和简单模拟实现(超级详细!!!)

目录 前言 1.STL是什么 2.vector使用 2.1 vector简介 2.2 常用接口函数 1. 构造函数 2.operator[ ]和size&#xff0c;push_back 3. 用迭代器进行访问和修改 4. 范围for遍历 5.修改类型函数 pop_back find insert erase 6. 容量相关函数capacity resize reserve 3.…

05.爬虫---urllib与requests请求实战(GET)

05.urllib与Requests请求实战GET 1.Urllib模块2.Requests模块3.对比4.实战 GET请求 Python中的GET请求也是HTTP协议中的一种请求方法&#xff0c;用于向服务器请求数据。与POST请求不同&#xff0c;GET请求将数据以查询字符串的形式附加在URL后面&#xff0c;而不是封装在请求体…

Windows10专业版系统安装Hyper-V虚拟机软件

Windows10专业版系统安装Hyper-V虚拟机软件 适用于在Windows10专业版系统安装Hyper-v虚拟机软件。 1. 安装准备 1.1 安装平台 Windows 10 1.2. 软件信息 软件名称软件版本安装路径windowswindows 10 专业版Hyper-vHyper-v 2. Hyper-v搭建 2.1打开cmd软件 2.2打开控制面…

20 厂商文档学习资料查询

01 厂商介绍 新华三&#xff08;H3C&#xff09; 新华三是一家专注于IT基础设施产品和解决方案的公司&#xff0c;提供从网络设备到数据中心解决方案的全套服务。它是中国领先的网络解决方案供应商之一&#xff0c;业务涵盖企业网、数据中心、云计算等多个领域。 华为&#x…

Golang dlv远程debug

1. 前期准备 1.1. dlv安装 1.1.1. go install安装 go install github.com/go-delve/delve/cmd/dlvlatest1.1.2. 手动安装 下载 linuxx86 架构 二进制文件 &#x1f4ce;dlv.linux.x86.zip zip文件&#xff0c;下载后&#xff08; 如果没权限&#xff0c;记得 执行chmod ax…

网络性能测试工具:iperf3介绍

文章目录 前言一、iperf3 的安装和使用下载和安装参数说明 二、iperf3 测试服务端启动客户端启动服务端输出反向测试客户端服务端 前言 新接触的网络环境如何评估网络带宽和吞吐量呢&#xff0c;有的项目没有对业务流量进行合理规划&#xff0c;服务或者中间件出口带宽经常有被…

Unity屏幕分辨率适配方法

Unity屏幕分辨率适配方法 在Unity中实现屏幕分辨率适配&#xff0c;可以使用以下几种方法&#xff1a; 1. 使用Canvas Scaler 创建Canvas&#xff1a; 在Unity编辑器中创建一个Canvas&#xff0c;它将自动添加一个Canvas Scaler组件。 设置Canvas Scaler&#xff1a; 选择Ca…

golang语言的gofly快速开发框架如何设置多样的主题说明

本节教大家如何用gofly快速开发框架后台内置设置参数&#xff0c;配置出合适项目的布局及样式、主题色&#xff0c;让你您的项目在交互上加分&#xff0c;也是能帮你在交付项目时更容易得到客户认可&#xff0c;你的软件使用客户他们一般都是不都技术的&#xff0c;所以当他们拿…

prometheusgrafananode_export搭建监控平台

一、环境要求 1、docker安装docker环境 2、docker安装prometheus 3、docker安装grafana 4、node-exportor(安装在被测服务器上) 5、我的服务器是Ubuntu 二、docker 安装prometheus 1、下载Prometheus镜像 docker pull prom/prometheus 2、检查端口是否被占用 安装netstat命…

在Github找自己想要的的项目

点击进入github 1.首先进入到github的首页&#xff1b;搜索框搜&#xff08;先关键字搜索&#xff09;in:name 你的找的项目 比如&#xff1a; in:name Sping Boot2.进一步检索&#xff08;点赞数高的&#xff09; in:name Sping Boot star:>1000 3.如何要找最新的&…