3-5 单链表分段逆转

给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转。例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4;如果 K=4,则应该得到 4→3→2→1→5→6。

函数接口定义:

void K_Reverse( List L, int K );

其中List结构定义如下:

typedef struct Node *PtrToNode;struct Node {ElementType Data; /* 存储结点数据 */PtrToNode   Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */

L是给定的带头结点的单链表,K是每段的长度。函数K_Reverse应将L中的结点按要求分段逆转。

裁判测试程序样例:

#include <stdio.h>#include <stdlib.h>typedef int ElementType;typedef struct Node *PtrToNode;struct Node {ElementType Data; /* 存储结点数据 */PtrToNode   Next; /* 指向下一个结点的指针 */};typedef PtrToNode List; /* 定义单链表类型 */List ReadInput(); /* 裁判实现,细节不表 */void PrintList( List L ); /* 裁判实现,细节不表 */void K_Reverse( List L, int K );int main(){List L;int K;L = ReadInput();scanf("%d", &K);K_Reverse( L, K );PrintList( L );return 0;}/* 你的代码将被嵌在这里 */

输入样例:

6
1 2 3 4 5 6
4

输出样例:

4 3 2 1 5 6

代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
C (gcc)

思路:

定义一个数组,以及计数变量cnt
定义一个指针变量遍历链表L将L的数据元素存入数组中
将这些数据分组,K个一组逆序输出,不足K的顺序不变
比如K=3 ,cnt=9,那么可以分成两组
输出
a[2] a[1] a[0]
a[5] a[4] a[3]
a[8] a[7] a[6]
一共输出(cnt-cnt%K)个数【因为不成组的顺序不变】,然后将这些数赋值给p
我们总结一下规律
可以设置一个变量i 从0到(cnt-cnt%K) 用一个for循环输出这么多数,再在循环中设置一个变量j,输出a[j]。
2 1 0恰好是K-1 K-2 K-3;5 4 3 恰好是2K-1 2K-2 2K-3 依次类推,j=tK-1,t从1到组数(cnt/K),t的编号怎么实现呢,我们可以发现当j从2到0 再次进入循环为-1 时,t变成2
从5到3 再次进入循环为2时,t变成3
-1 ,2 ,…依次类推 -1 2 5 …这些数都是(t-1)*K-1
所以当j小于(t-1)*K时,t++
最后我们将p数值赋值为a[j]
p指针移到下一位置
(哦莫,有点乱。。。)

代码样例:

void K_Reverse( List L, int K ){int a[1000000];int cnt;List p=L->Next;while(p){a[cnt++]=p->Data;p=p->Next;}p=L->Next;//p指向第一个数据节点int i,j=K-1,t=1;for(i=0;i<cnt-cnt%K;i++){if(j<(t-1)*K){t++;j=t*K-1;}p->Data=a[j--];p=p->Next;}
}

3-5 单链表分段逆转相关推荐

  1. PTA 单链表分段逆转 (12 分)

    单链表分段逆转 (12 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4 ...

  2. 3-5 单链表分段逆转 (20 分)

    给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4:如果 K=4,则应该得到 4 ...

  3. 1-3(*) 单链表分段逆转

    给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4:如果 K=4,则应该得到 4 ...

  4. 单链表的逆转:(头尾互换)

    单链表的逆转:(头尾互换)  1 迭代反转(适用于反转不带头节点的链表) 从当前链表的首元节点开始,一直遍历到链表的最后一个节点,这期间逐个改变所遍历到的节点的指针域,另其指向前一个节点.     方 ...

  5. 单链表原地逆转 c语言,链式结构线性表的实现(二)

    链式结构线性表的实现(二) 一.目的: 掌握链表的表示方法,存储结构及其基本操作的实现,灵活使用链表. 二.要求: 修改实验三的程序,完成 (1)实现带头接点的单链表的原地逆转(结果链表仍使用原链表的 ...

  6. 逆转线性单链表 c语言,单链表的逆转,不会做啊

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以前做的还找得到,呵呵,绐你贴出来了,C语言版的 #include struct datatype{ char a[30]; }; struct node ...

  7. 求单链表的最大值与原地逆转_数据结构精选考研试题.pdf

    [注]:编写程序可选用任一种高语言,算法描述可采用类语言,必要时加上注释 一. 回答下列问题:[20分] 1. 算法的定义和性质 2. 为什么说数组与广义表是线性表的推广? 3. 什么是结构化程序设计 ...

  8. 【数据结构】单链表的应用(C语言)

    1.设计一个算法,求一个单链表中的节点数 2.设计一个算法,在一个单链表中值为y的结点前插入一个值为x的结点(值为x的新结点为成为值为y的结点前驱结点) 3.设计一个算法,判断单链表中各结点是否有序 ...

  9. java 链表反转_剑指BAT:如何最优雅着反转单链表?

    前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢 [题目描述] 反转单链表.例如链表为: ...

  10. 单链表操作——交换节点

    链表是最为常见,并且经常需要使用到的数据结构之一.对于单链表的基本操作,例如创建链表.插入.删除等都不是特别复杂,但是其实对于链表的操作实际上很多的操作还是有一定的难度,例如上次给出的单链表的逆转,以 ...

最新文章

  1. jupyterlab debugger+显示图片
  2. 在python中定义类时、运算符重载_python自定义类运算符重载
  3. 微信h5网页关闭分享以及关闭当前页面
  4. (转)微服务架构 互联网保险O2O平台微服务架构设计
  5. CUDA:一维、二维的grid、block的核函数线程分配
  6. 我们行业有一个同行,他和身边所有的人都交好过,包括我
  7. 机器字长 存储字长 指令字长 机器字长
  8. snmpwalk 获取端口流量_通过snmpwalk命令计算接口速率
  9. 音频编解码介绍(最全v1.0)
  10. python调用bash shell脚本
  11. Linux cp: omitting directory错误的原因及解决办法
  12. java socket ascii_TCP套接字上的ASCII - java
  13. 游戏安全初学者学习资料
  14. ip地址位置提供商查询 cip.cc/ip
  15. grequests并发之小试牛刀
  16. 学习 JavaScript
  17. 【R】【密度聚类、层次聚类、期望最大化聚类】
  18. 多线程-并发编程(7)-生产者消费者模式及非阻塞队列与阻塞队列实现
  19. 【树莓派】带你从0到1完成魔镜制作
  20. ESTJ型人格的性格缺陷和心理问题分析

热门文章

  1. python-多态_new魔法方法_单态模式_连贯操作
  2. 我辞去了年收入50万的工作,去做在线教育的老师
  3. 集成电路 Trimming
  4. 免费的虚拟主机 000webhost
  5. QNX Hypervisor —— 虚拟设备
  6. CS61C Spring 2021——Project 3: CS61CPU要求及实现思路
  7. cs224n 2019 Lecture 7: Vanishing Gradients and Fancy RNNs
  8. 010 《你不理财,财不理你》读书笔记
  9. java audio 分帧_语音特征参数MFCC提取过程详解
  10. 个人电子邮箱怎么注册?