《数据结构》02-线性结构3 Reversing Linked List

2023-10-27

题目

Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K=3, then you must output 3→2→1→6→5→4; if K=4, you must output 4→3→2→1→5→6.

Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (≤10​ 5 ^5 5​​ ) which is the total number of nodes, and a positive K (≤N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.

Then N lines follow, each describes a node in the format:

Address Data Next
where Address is the position of the node, Data is an integer, and Next is the position of the next node.

Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.

Sample Input:

00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218

Sample Output:

00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

分析

题目大概意思就是给一组格式是Address data next的结点,按要求逆序输出
先观察,逆序后不变的地方是前两组数据,即每个结点的 Address 和 data 是不变的,继续观察,其实当前结点的 next 是下一个结点的 Address
我们考虑将 Address 和 data 存起来,还要体现它们的关系,可以用数组 Data[Address] = data,同样的,我们可以将 next 和 Address 也以这种形式存储,即 Next[Address] = next
这样存储的结果是,知道 Address 我们可以通过 Data[ ] 数组找到对应 data,可以通过 Next[ ] 数组找到对应的 next
这样存储后,我们再把整个链表“理顺”,给出的 first node 即为第一个 Address,Next[first node] 是下一个结点的 Address,再用一个数组 list[ ] 把每次遇到的 Address 记录下来
到此为止我们有了能根据 Address 找到其他数据的关系数组,也有顺序记录 Address 的数组,问题就从"反转链表"简化为了"反转 Address"
再以每 K 个结点为区间,反转 list[ ] 数组中存储的 Address,再根据 Address 和其他数据的关系,就能完整地输出链表了!

#include<stdio.h>
#include<iostream>
#define MaxSize 100005
using namespace std;
int main(){
	int Data[MaxSize];
	int Next[MaxSize];
	int list[MaxSize];
	int FirstAdd,N,K;
	scanf("%d %d %d",&FirstAdd,&N,&K);
	for(int i=0;i<N;i++){
		int tmpAdd,tmpData,tmpNext;
		scanf("%d %d %d",&tmpAdd,&tmpData,&tmpNext);
		Data[tmpAdd] = tmpData;
		Next[tmpAdd] = tmpNext;
	}
	int sum=0;   // 累计有效结点数 
	while(FirstAdd!=-1){   // 当尾结点为 -1 时结束 
		list[sum++] = FirstAdd;   // 记录所有Address
		FirstAdd = Next[FirstAdd];  // 找下一个结点 
	}
	for(int i=0;i<sum-sum%K;i+=K){  // 每 K 个结点一个区间 
		for(int j=0;j<K/2;j++){  // 反转链表
			int t = list[i+j];
			list[i+j] = list[i+K-j-1];
			list[i+K-j-1] = t; 
		}
	}
	for(int i=0;i<sum-1;i++)
		printf("%05d %d %05d\n",list[i],Data[list[i]],list[i+1]);
	printf("%05d %d -1\n",list[sum-1],Data[list[sum-1]]);
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《数据结构》02-线性结构3 Reversing Linked List 的相关文章

随机推荐

  • C++中"endl"和"\n"的区别

    换行符 endl 该符号与 n 的区别 endl 除了具备 n 的功能外 还调用输出流flush函数 刷新缓冲区 让数据直接写入文件或者屏幕上 这两种都可以用的 不过如果需要立即显示 比如输入到显示器的场合 最好用 endl 如果不需要立即
  • 《蓝桥杯真题》:2020年单片机省赛(第十一 / 11届第一场)

    2020年单片机省赛 有关题目 实现代码 main c 写法一 写法二 iic h iic c 有关题目 实现代码 注意 代码实现方面 从eeprom读出数据的过程中要注意不跟和从pcf8591读取数据一样 不需要rd eeprom 0x0
  • go之构建简单的web服务器3.0

    引入etcd模块 实现对etcd的增删改 目录架构如下 etcd go代码 package storage import context time fmt errors clientv3 go etcd io etcd client v3
  • C与PHP的联系与区别

    联系 1 PHP是C语言实现的一个应用软件 PHP的程序执行 最终也是调用C函数 很多时候 一些要优化性能的工作可以通过对PHP进行C扩展来实现 区别 0 PHP是面向对象语言 C是面向过程的函数过程式语言 1 PHP是弱类型语言 使用变量
  • 【Inno Setup】Inno Setup覆盖安装前执行卸载、获取原安装路径

    Inno Setup Inno Setup覆盖安装前执行卸载 获取原安装路径 分享下目前用到的一个简单的 Inno Setup 安装包制作脚本 主要功能有3个 安装前检测是否已安装 如果是覆盖安装则提示是否先进行卸载 程序卸载时不会自动卸载
  • Navicat Premium下sql导入中文乱码解决方案

    最近帮客户导数据比较多 用阿里云感觉不方便 Navicat Premium还是好用 但是数据稻城excel就会乱码 解决方案 1 看图说话 右键选中 2 三条SQL完成 mysql gt show databases Database in
  • 「Python 面试」第六次面试

    1 说一说 Redis 是什么 Redis 是一种 Key Value 的内存型 非关系型数据库 属于 NoSQL 的一种 Redis 的读写速度特别快 特别适合读写频繁的场景 Redis 支持主从复制 支持数据持久化 2 知道 Redis
  • MMD相关制作

    1 导入可转换mmd和vmd 动作数据 的插件 导入后unity中为 2 导入模型和vmd和音频 3 在unity中点击模型右边弹出的协议全打勾并应用 4 其中的mmd动作数据转换成功 点击人物把rig下第一个选择Huamoid点击应用 再
  • Vue中nextTick使用

    1 语法 this nextTick 回调函数 2 作用 在下一次Dom更新结束后执行其指定的回调函数 3 使用场景 当数据改变后 要基于更新后的新Dom进行某些操作时 要在nextTick所指定的回调函数中执行
  • 查询oracle所用用户,查询所有用户(oracle查询所有用户)

    查询所有用户 oracle查询所有用户 2020 07 24 11 10 05 共10个回答 1 查询oracle中所有用户信息select fromdba users 2 只查询用户和密码selectusername passwordfr
  • 数据结构---桶排序

    桶排序 第一步 第二步 第三步 第四步 JAVA实现 时间复杂度 空间复杂度总结 每一个桶 bucket 代表一个区间范围 里面可以承载一个或多个元素 第一步 就是创建这些桶 并确定每一个桶的区间范围 我们这里创建的桶数量等于原始数列的元素
  • python Matplotlib库基础

    目录 Matplotlib 数据可视化入门 Pyplot 绘图 自定义配置文件 rcParams 创建绘图窗口 绘制子图 绘制饼图 绘制折线图 绘制条形图 绘制散点图 绘制热点图 绘制箱型图 绘制分类图背景 显示绘图窗口 DataFrame
  • FATFS文件系统f_mkfs函数详解

    1 f mkfs参数 参数path 要挂载 卸载的逻辑驱动器号 使用设备根路径表示 参数opt 系统的格式 如图所示 若需要格式化为FAT32文件系统 则选择FM FAT32即可 若需要格式化为exFAT文件系统 则应该开将宏定义 defi
  • kNN做回归任务

    kNN回归 kNN常用作分类任务 但是也可以做回归任务 做法 使用kNN计算某个数据点的预测值时 模型会从训练数据集中选择离该数据点最近的k个数据点 并且把他们的y值取均值 把该均值作为新数据点的预测值 代码 此次代码演示使用数据库中的鸢尾
  • AI业务强劲增长,百度迎来了“推卒过河”的纵横时刻

    文 螳螂观察 作者 陈淼 科技创新面临的处境与机遇大多与中国象棋中的 卒 相似 单次只能走一步 不像其他棋子一次能走多步 然而一旦 推卒过河 卒 就可纵可横 能发挥出极大的作用 因此 也就有了 过河走卒胜似车 的谚语 这种境遇像极了今天在人
  • linux下执行shell脚本报“ $'\r':command not found…”错误

    1 现象 在linux下执行脚本有时会出现错误如下 r command not found 2 原因分析 脚本本身却没有错误 是由于脚本在windows下打开过编辑过 因为在windows下的换行是回车 换行 r n 而在linux下的换行
  • BeautifulSoup解析通过js生成内容的本地html文件

    问题 当本地html文件中的元素都是由js生成时 我们无法通过beautifulsoup进行解析 思路 1 通过webdriver的无头浏览器 不在桌面打开浏览器的情况下 通过浏览器引擎加载html文件 2 获取浏览器的页面资源 3 将资源
  • 命名Java变量

    Java变量的命名规则 在面向对象编程中 对于包 类 方法和常量的命名都是有规则的 例如 英文大小写的区分 1 包的命名 包的命名都是由小写字母组成 为了保障每个Java包命名的唯一性 应在自己定义的包的名称前加上唯一的前缀 例如 edu
  • java solr功能代码

    package com wlsq search center util import org apache solr client solrj SolrQuery import org apache solr client solrj im
  • 《数据结构》02-线性结构3 Reversing Linked List

    题目 Given a constant K and a singly linked list L you are supposed to reverse the links of every K elements on L For exam