3-5 单链表分段逆转
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 单链表分段逆转相关推荐
- PTA 单链表分段逆转 (12 分)
单链表分段逆转 (12 分) 给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4 ...
- 3-5 单链表分段逆转 (20 分)
给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4:如果 K=4,则应该得到 4 ...
- 1-3(*) 单链表分段逆转
给定一个带头结点的单链表和一个整数K,要求你将链表中的每K个结点做一次逆转.例如给定单链表 1→2→3→4→5→6 和 K=3,你需要将链表改造成 3→2→1→6→5→4:如果 K=4,则应该得到 4 ...
- 单链表的逆转:(头尾互换)
单链表的逆转:(头尾互换) 1 迭代反转(适用于反转不带头节点的链表) 从当前链表的首元节点开始,一直遍历到链表的最后一个节点,这期间逐个改变所遍历到的节点的指针域,另其指向前一个节点. 方 ...
- 单链表原地逆转 c语言,链式结构线性表的实现(二)
链式结构线性表的实现(二) 一.目的: 掌握链表的表示方法,存储结构及其基本操作的实现,灵活使用链表. 二.要求: 修改实验三的程序,完成 (1)实现带头接点的单链表的原地逆转(结果链表仍使用原链表的 ...
- 逆转线性单链表 c语言,单链表的逆转,不会做啊
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 以前做的还找得到,呵呵,绐你贴出来了,C语言版的 #include struct datatype{ char a[30]; }; struct node ...
- 求单链表的最大值与原地逆转_数据结构精选考研试题.pdf
[注]:编写程序可选用任一种高语言,算法描述可采用类语言,必要时加上注释 一. 回答下列问题:[20分] 1. 算法的定义和性质 2. 为什么说数组与广义表是线性表的推广? 3. 什么是结构化程序设计 ...
- 【数据结构】单链表的应用(C语言)
1.设计一个算法,求一个单链表中的节点数 2.设计一个算法,在一个单链表中值为y的结点前插入一个值为x的结点(值为x的新结点为成为值为y的结点前驱结点) 3.设计一个算法,判断单链表中各结点是否有序 ...
- java 链表反转_剑指BAT:如何最优雅着反转单链表?
前言 以专题的形式更新刷题贴,欢迎跟我一起学习刷题,相信我,你的坚持,绝对会有意想不到的收获.每道题会提供简单的解答,如果你有更优雅的做法,欢迎提供指点,谢谢 [题目描述] 反转单链表.例如链表为: ...
- 单链表操作——交换节点
链表是最为常见,并且经常需要使用到的数据结构之一.对于单链表的基本操作,例如创建链表.插入.删除等都不是特别复杂,但是其实对于链表的操作实际上很多的操作还是有一定的难度,例如上次给出的单链表的逆转,以 ...
最新文章
- jupyterlab debugger+显示图片
- 在python中定义类时、运算符重载_python自定义类运算符重载
- 微信h5网页关闭分享以及关闭当前页面
- (转)微服务架构 互联网保险O2O平台微服务架构设计
- CUDA:一维、二维的grid、block的核函数线程分配
- 我们行业有一个同行,他和身边所有的人都交好过,包括我
- 机器字长 存储字长 指令字长 机器字长
- snmpwalk 获取端口流量_通过snmpwalk命令计算接口速率
- 音频编解码介绍(最全v1.0)
- python调用bash shell脚本
- Linux cp: omitting directory错误的原因及解决办法
- java socket ascii_TCP套接字上的ASCII - java
- 游戏安全初学者学习资料
- ip地址位置提供商查询 cip.cc/ip
- grequests并发之小试牛刀
- 学习 JavaScript
- 【R】【密度聚类、层次聚类、期望最大化聚类】
- 多线程-并发编程(7)-生产者消费者模式及非阻塞队列与阻塞队列实现
- 【树莓派】带你从0到1完成魔镜制作
- ESTJ型人格的性格缺陷和心理问题分析
热门文章
- python-多态_new魔法方法_单态模式_连贯操作
- 我辞去了年收入50万的工作,去做在线教育的老师
- 集成电路 Trimming
- 免费的虚拟主机 000webhost
- QNX Hypervisor —— 虚拟设备
- CS61C Spring 2021——Project 3: CS61CPU要求及实现思路
- cs224n 2019 Lecture 7: Vanishing Gradients and Fancy RNNs
- 010 《你不理财,财不理你》读书笔记
- java audio 分帧_语音特征参数MFCC提取过程详解
- 个人电子邮箱怎么注册?