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 (<= 105) 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 //第一行:链表的首地址add,结点个数n,每隔k个进行一次反转

00000 4 99999 //后面n行:结点的地址address,数据data,下一个结点的地址next

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

题目大意:

反转单链表,给定常数K和单链表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.

特殊情况:

1. 有其他链表干扰(即有多个-1出现):找链表有效长度

2. k=1 或者 k=n :不变 或者 全部逆序

3. 需逆序的起点大于有效长度 : 直接输出原链表

推荐测试:

1. k=1或者k=n:

00100 6 6

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 00000

99999 5 68237

12309 2 33218

2. 有其他链表干扰(即有多个-1出现):

00100 6 2

00000 4 99999

00100 1 12309

68237 6 -1

33218 3 -1

99999 5 68237

12309 2 33218

– 定义结构

struct Node {

int iData;

int iNext;

};

const int iMaxLen = 100004;

int iHead; //!首地址

int N, K;

Node NodeList[iMaxLen];

– paixu():

1. 找有效长度:判断next是否遇到-1

2. 若需逆序的起点 > 有效长度(k > iEffectiveLength):doPrint(iHead)

3. 更新结点总数 N 为有效长度 iEffectiveLength

K>1:

4. 初始化新链表(反转后)的首尾地址

// iNewHead,iLastTail 表示新链表(反转后)的首尾地址

// iTheHead,iTheTail 表示链表中反转的每一小节的开头和结尾

reverseK(iHead, K, &iTheHead, &iTheTail);

iNewHead = iTheHead;

iLastTail = iTheTail;

5. 计算反转次数:

iReserveCount = N/K – 1

6. 每K个翻转一次

for(int i = 0; i < iReverseCount; ++i) {

reverseK(NodeList[iTheTail].iNext, K, &iTheHead, &iTheTail);

NodeList[iLastTail].iNext = iTheHead;

iLastTail = iTheTail;

}

K<=1:

iNewHead = iHead;

7.输出链表:

doPrint(iNewHead);

– reverseK():

从 iStartHead 开始反转k个元素(原理即单链表反转)

int reverseK(int iStartHead, int iK, int *pHead, int *pTail)

//iStartHead:每一小节开始反转的结点

//node1,node2,nodeTmp:可看作反转所需的三个指针

完整代码:

#include

struct Node {

int iData;

int iNext;

};

const int iMaxLen = 100004;

int iHead; //!首地址

int N, K;

Node NodeList[iMaxLen];

void doPrint(int iNodeAdd)

{

while(iNodeAdd!=-1){

if(NodeList[iNodeAdd].iNext == -1){

printf("%.5d %d -1\n",iNodeAdd,NodeList[iNodeAdd].iData);

break;

}

printf("%.5d %d %.5d\n",iNodeAdd, NodeList[iNodeAdd].iData, NodeList[iNodeAdd].iNext);

iNodeAdd = NodeList[iNodeAdd].iNext;

}

}

//!从iStartHead开始反转k个元素

int reverseK(int iStartHead, int iK, int *pHead, int *pTail)

{

//!只有一个节点

if(-1 == iStartHead || iK <= 1)

return -1;

if(2 == iK){

int node1 = iStartHead;

int node2 = NodeList[iStartHead].iNext;

NodeList[node1].iNext = NodeList[node2].iNext;

NodeList[node2].iNext = node1;

*pHead = node2;

*pTail = node1;

return 0;

}

*pTail = iStartHead;

int node1 = iStartHead;

int node2 = NodeList[iStartHead].iNext;

int nodeTmp = -1;

for(int i = 0; i < iK - 1; ++i){

nodeTmp = NodeList[node2].iNext;

NodeList[node2].iNext = node1;

node1 = node2;

node2 = nodeTmp;

}

*pHead = node1;

NodeList[*pTail].iNext = node2;

return 0;

}

void paixu() {

int iNodeTmp = iHead;

//!找有效结点的长度:即判断next是否遇到-1

int iEffectiveLength = 1;

while(-1 != NodeList[iNodeTmp].iNext) {

++iEffectiveLength;

iNodeTmp = NodeList[iNodeTmp].iNext;

}

//!需逆序的起点大于有效长度

if(K > iEffectiveLength){

//!直接输出当前没有逆序的结点

doPrint(iHead);

}

//!有效长度覆盖输入的结点总个数

N = iEffectiveLength;

int iNewHead;

if(K > 1) {

int iTheHead, iTheTail;

int iLastTail;

//!first init reverse to decide the new head

reverseK(iHead, K, &iTheHead, &iTheTail);

iNewHead = iTheHead;

iLastTail = iTheTail;

int iReverseCount = N / K - 1; //!反转次数

for(int i = 0; i < iReverseCount; ++i) {

reverseK(NodeList[iTheTail].iNext, K, &iTheHead, &iTheTail);

NodeList[iLastTail].iNext = iTheHead;

iLastTail = iTheTail;

}

}

else

iNewHead = iHead;

doPrint(iNewHead);

}

int main() {

//!初始化 data和next都初始化为0

for(int i = 0; i < iMaxLen; ++i) {

NodeList[i].iData = 0;

NodeList[i].iNext = -1;

}

//!输入首地址,结点总数,需逆序到的数

scanf("%d %d %d", &iHead, &N, &K);

int iSingleNodeAddress, iSingleNodeData, iSingleNodeNext;

for(int i = 0; i < N; ++i) {

scanf("%d %d %d", &iSingleNodeAddress, &iSingleNodeData, &iSingleNodeNext);

NodeList[iSingleNodeAddress].iData = iSingleNodeData;

NodeList[iSingleNodeAddress].iNext = iSingleNodeNext;

}

paixu();

return 0;

}

每隔k次反转一次 链表_PTA 5-2 Reversing Linked List (25) [法一] - 线性表 - 链表反转 (PAT 1074)...相关推荐

  1. 线性表——链表ChainList的实现 C++

    本文主要总结常用的数据结构--线性表之链式描述,实现其基本的增删查改功能,不涉及完整功能,目的是为了熟悉常用数据结构属性和代码实现底层原理. 顺序表结构有以下缺点: 插入或删除节点时,需要移动大量数据 ...

  2. 线性表 ----链表的C语言实现

    2019独角兽企业重金招聘Python工程师标准>>> 本人刚开始研究数据结构,欢迎拍砖!!! 首先从最简单的线性表开始 1.线性表存储结构 a.顺序存储,最简单来说就是数组了吧,这 ...

  3. python删除链表满足pred的元素_python 数据结构一 之 线性表

    python数据结构教程第一课 从这里将会正式开始讲解python的一些实用的数据结构,原理加上实例源码. 一.简介 二.线性表的抽象数据类型 三.顺序表的实现 四.链接表的实现 1.单链表 2.带尾 ...

  4. 数据结构与算法 | 线性表 —— 链表

    原文链接:wangwei.one/posts/java-- 链表 定义 逻辑结构上一个挨一个的数据,在实际存储时,并没有像顺序表那样也相互紧挨着.恰恰相反,数据随机分布在内存中的各个位置,这种存储结构 ...

  5. 2021-9-下旬 数据结构-线性表-链表-java代码实现(复习用)

    链表涉及到指针了,这里我还不了解java里对指针的隐藏,又由于以前学过C++里的指针,二者混淆,导致一开始非常蒙,出了很多问题,当然后来随着边写边查,基本都解决了. 顺便学习了一下java里的泛型 / ...

  6. step3 . day2 数据结构之线性表链表

    今天继续学习数据结构的线性表部分,从基础的顺序表到链表,类比写了一些调用函数,完成了表的增删改查排序等问题. 尤其是链表的排序,费了很大的心思终于捋顺写出来了,小有成就感,而且代码一次通过率越来越高, ...

  7. 单链表删除所有值为x的元素_线性表之单链表

    单链表 一种以链接方式存储的线性表,适用于频繁增删操作,存储空间不定的情形. 单链表的一个存储结点包含两个域,数据域和指针域.数据域用于存储线性表的一个数据元素,指针域用于指示下一个结点开始的存储地址 ...

  8. 线性表——链表(单链表)

    一.前提引入 之前我们已经使用顺序存储结构实现了线性表,我们会发现虽然顺序表的查询很快,时间复杂度为 O(1), 但是增删的效率是比较低的,因为每一次增删操作都伴随着大量的数据元素移动.这个问题有没有 ...

  9. 1074 Reversing Linked List (25 分)【难度: 一般 / 知识点: 链表】

    https://pintia.cn/problem-sets/994805342720868352/problems/994805394512134144 乙级里面的原题吧,就用哈希表建链表,reve ...

最新文章

  1. UVa1388 - Graveyard
  2. Spring5源码 - 08 BeanFactory和FactoryBean 源码解析 使用场景
  3. xp下administrator用户登录条不显示,怎么办?
  4. 《C++ Primer》7.3.2节练习
  5. word表格图片自动适应表格大小_Excel应用实践20:使用Excel中的数据自动填写Word表格...
  6. [原创]vc中创建线程并传递参数
  7. oracle修改用户的登录密码
  8. 关于js里的那一堆事件
  9. 用 MeGUI 压制 DVDrip 入门
  10. 使用pandas的merge出现Empty DataFrame 和 Index: []
  11. 35岁后你的职场危机,你该何去何从
  12. 台式电脑添加共享计算机,台式电脑怎么设置wifi共享
  13. 怎么制作QQ背景音乐链接
  14. java web代码及展现_抓网页_面包网_javaWeb展示
  15. Tomcat里 appBase和docBase的区别
  16. TimerFd使用心得
  17. 901虎年期待和变元的哥德尔数配置——哥德尔原著英译本拆解汉译之五
  18. 胡喜:从 BASIC 到 basic ,蚂蚁金服技术要解决两个基本的计算问题
  19. [CocosCreator]使用龙骨DragonBone
  20. C#中的委托和事件(分分钟上手)

热门文章

  1. 学习笔记:Model Diagnostics-模型诊断(线性回归)
  2. 单细胞RNA降维之UMAP
  3. Benchmarking of long-read correction methods长期校正方法的基准测试
  4. 三大测序平台芯片通量对比图
  5. python学习之第三课时--基本数据类型及区别,变量
  6. 【node】express中mysql的基本用法、连接池的使用、事务的回滚
  7. pycharm的anaconda配置
  8. 二值网络--Optimize Deep Convolutional Neural Network with Ternarized Weights and High Accuracy
  9. 语义分割--Pixel Deconvolutional Networks
  10. android 集合 内存泄漏,Android内存泄漏第二课--------(集合中对象没清理造成的内存泄漏 )...