开学第二次作业(5.14)

代码传送门

题目

给定一个常数K以及一个单链表L,请编写程序将L中每K个结点反转。例如:给定L为1→2→3→4→5→6,K为3,则输出应该为3→2→1→6→5→4;如果K为4,则输出应该为4→3→2→1→5→6,即最后不到K个元素不反转。

输入格式:

每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址、结点总个数正整数N(<= 105)、以及正整数K(<=N),即要求反转的子链结点的个数。结点的地址是5位非负整数,NULL地址用-1表示。

接下来有N行,每行格式为:

Address Data Next

其中Address是结点地址,Data是该结点保存的整数数据,Next是下一结点的地址。

输出格式:

对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。

输入样例:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
输出样例:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1

这题大家每个人都做过了,不过是换成了新的方法--链表而已,也没啥好说的了,不过需要注意的是,本题一开始依然是不能创建链表的,应该要先把每个节点先存储起来(用原来的老方法),之后再创建链表、反转链表,仅此而已。


以下给出代码(这次作业代码后面有彩(吐)蛋(槽))

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
struct Link
{
int Data;
int Adress;
Link *nx;
}; int N,K;
int f[1000050] = {0};
int Now[100050] = {0};
int Back[100050] = {0};
int Data[100050] = {0}; void CreatLink(Link *head)//创建链表
{
Link *p,*q = head;
int coun = 0;
int t = 0;
while (Back[t] != -1)
{
t = f[Back[t]];
p = new Link;
p->Data = Data[t];
p->Adress = Now[t];
q->nx = p;
q = p;
coun++;
}
N = coun; //可能有链表外的点
p->nx = NULL;
return;
} Link* Rotation(Link *p,Link *q)//p为需要反转的前一个节点, q为需要反转最后一个结点的后一个
{
Link *r1 = p->nx; //当前反转的结点
Link *r2; //记录当前反转结点的下一个节点
Link *r3 = p->nx; //记录反转的第一个结点,用于最后要连到全部反转后的下一个结点
while (r1 != q)
{
r2 = r1->nx;
r1->nx = p->nx;
p->nx = r1;
r1 = r2;
}
r3->nx = q;
return r3;//返回反转段的最后一个结点
}
int main()
{
// freopen("xx.txt","r",stdin); /*保存各个点*/
scanf("%d %d %d",&Back[0],&N,&K);
int i;
for (i = 1; i < N + 1; i++)
{
scanf("%d %d %d",&Now[i],&Data[i],&Back[i]);
f[Now[i]] = i;
} /*创建链表*/
Link *head = new Link;
head->nx = NULL;
CreatLink(head); /*反转链表*/
int T = N/K;
Link *p,*q = head;
for (i = 0; i < T; i++)
{
p = q;
int coun = 0;
while(coun < K)
{
coun++;
q = q->nx;
}
q = Rotation(p,q->nx);
} /*输出链表 */
p = head->nx;
delete head;
while (p->nx)
{
printf("%05d %d %05d\n",p->Adress ,p->Data, p->nx->Adress);
q = p;
p = p->nx;
delete q;//C程序设计平台上面这句话留着会给你2个RE,我不知道为啥
}
printf("%05d %d -1\n",p->Adress ,p->Data);
delete p; return 0;
}

一点比较

本题其实最好的方法并不是链表(最好啥方法我也不知道),相比链表,用数组方式模拟链表效果更好

以下给出对比:

用链表方式:



用数组模拟:



比较点:

1.运行速度

无论是PAT上还是程序设计的编译器上,用数组模拟都更快一筹

2.使用内存

其实我没想到使用内存会差这么多...可能我自己的原因?

3.代码实现复杂程度

这个不用说了把,链表易错啊易错,而数组操作起来相对简单,只要熟练运用数组模拟的方法,肯定比链表省事啊

其实说道实现复杂程度,还有一个比较重要的原因:

我!不!会!用!链!表!debug!(这个就比较尴尬了....)

讲道理,我想过怎么弄

1.设置酱油变量专门用来给调试看当前链表指针的值

2.很low的写一个循环输出值

然后,我选择了第二种....(第二种方便不费脑丫)

所以这次作业就是用来熟悉链表而已啦,一般人也不会在oj上面随便打链表的把....

就是这样子,没神马大问题,就是对我来说,链表调试是一个痛点。

C++开学第二次作业(5.14)的更多相关文章

  1. 耿丹CS16-2班第二次作业汇总

    -- Deadline: 2016-09-28 12:00 -- 作业内容:http://www.cnblogs.com/huangjunlian/p/5891726.html -- 第二次作业总结: ...

  2. SQL 第二章 作业

    /*第二章 作业*/ create table S ( sno char(2) NOT NULL UNIQUE, sname char(3), city char(2) ); alter table ...

  3. 集大1513 & 1514班 软件工程第二次作业评分与点评

    谢谢按时完成作业的同学. 请大家在今后的作业中多思考,认真完成并注意作业的原创性. 学号 作业标题 作业地址 提交日期 分数 201521121087 微信APP简要分析 http://www.cnb ...

  4. OO第二单元作业总结【自我反思与审视】

    第二单元作业的完成史,就是一部心酸的血泪史…… 多线程的出现为我(们)打开一片广阔的天地,我也在这方天地摸爬滚打,不断成长!如果说第一单元之前还对Java语法有所了解的话,那么这单元学习多线程则完全是 ...

  5. 2017-2018-1 Java小组-1623 第二周作业

    2017-2018-1 Java小组-1623 第二周作业 关于游戏软件的问题 讨论结果 20162301张师瑜 20162305李昱兴 20162306陈是奇 20162308马平川 2016231 ...

  6. BUAA OO 2019 第二单元作业总结

    目录 总 架构 controller model view 优化算法 Look 算法 多种算法取优 预测未来 多线程 第五次作业 第六次作业 第七次作业 代码静态分析 UML 类图 类复杂度 类总代码 ...

  7. 第二次作业——个人项目实战(sudoku)

    第二次作业--个人项目实战(sudoku) 一.作业要求地址 第二次作业--个人项目实战 二.Github项目地址 softengineering1--sudoku 三.PSP表格估计耗时 PSP2. ...

  8. Java第二次作业參考代码

    Java第二次作业參考代码 [程序11] 题目:有1.2.3.4四个数字,能组成多少个互不同样且无反复数字的三位数?都是多少? public class lianxi11 { public stati ...

  9. 2019-2020-1 20199303<Linux内核原理与分析>第二周作业

    2019-2020-1 20199303第二周作业 1.汇编与寄存器的学习 寄存器是中央处理器内的组成部份.寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令.数据和位址.在中央处理器的控制部件中 ...

随机推荐

  1. 苹果MAC安装Windows系统

    一,选择实用工具 二,选择分区助理 三,创建安装U盘或者安装 如没有安装U盘需要现创建一个,安装镜像需要事先准备好,制作好了安装U盘就选择第三项安装 四,为windows分区(建议分30G) 系统会格 ...

  2. CentOS设置密码复杂度及过期时间等

    我们在使用linux系统设置密码的时候,经常遇到这样的问题,系统提示:您的密码太简单,或者您的密码是字典的一部分.那么系统是如何实现对用户的密码的复杂度的检查的呢? 系统对密码的控制是有两部分(我知道 ...

  3. iwconfig

    解决办法:清空/var/lib/dhclient/dhclient.leases文件里的所有内容 # sudo dhclient -r //release ip 释放IP # sudo dhclien ...

  4. Yii框架2.0的小部件

    小部件是视图里的可重用单元. 小部件是在视图中使用的,但是可能需要使用控制器传给他的模型,比如在渲染表单的时候.比如一般的时间拾取器就可以直接砸视图里加入如下代码就可以: <?php use y ...

  5. 雨痕 的《Python学习笔记》--附脑图(转)

    原文:http://www.pythoner.com/148.html 近日,在某微博上看到有人推荐了 雨痕 的<Python学习笔记>,从github上下载下来看了下,确实很不错. 注意 ...

  6. 003-maven简介

    1.1简介 Maven,只是的积累,专家或内行 Maven是优秀的构建工具,依赖管理工具,项目信息管理工具,跨平台.提供了中央仓库,自动下载构件. 1.通过坐标系统定位每一个构件(artifact), ...

  7. 009-Hadoop Hive sql语法详解4-DQL 操作:数据查询SQL-select、join、union、udtf

    一.基本的Select 操作 语法SELECT [ALL | DISTINCT] select_expr, select_expr, ...FROM table_reference[WHERE whe ...

  8. Spark机器学习系列之13: 支持向量机SVM

    Spark 优缺点分析 以下翻译自Scikit. The advantages of support vector machines are: (1)Effective in high dimensi ...

  9. HBase在HDFS上的目录树

    众所周知,HBase 是天生就是架设在 HDFS 上,在这个分布式文件系统中,HBase 是怎么去构建自己的目录树的呢? 这里只介绍系统级别的目录树: 一.0.94-cdh4.2.1版本 系统级别的一 ...

  10. 我在Xcode 6上Swift框架的测试经验分享

    我耗费了两个多月时间来琢磨Swift作为一门函数是编程语言都能做些什么,而今已经转移 到使用Swift来开发库文件了. 我花了一天的时间,最后发觉之前做的Swift特性探究是相当愉快的经历,我发现仍旧 ...