PAT乙级1025

来源:互联网 发布:淘宝卖家发货怎么打包 编辑:程序博客网 时间:2024/06/04 00:54

1025. 反转链表 (25)

时间限制
300 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

给定一个常数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 400000 4 9999900100 1 1230968237 6 -133218 3 0000099999 5 6823712309 2 33218
输出样例:
00000 4 3321833218 3 1230912309 2 0010000100 1 9999999999 5 6823768237 6 -1

#include<stdio.h>#include<algorithm>#include<stack>using namespace std;struct Node{int data;int next;}node[100000];//定义静态链表节点struct record{int address;//int next;};//用于反转链表int main(){for (int i = 0; i < 100000; i++){node[i].data = 0;node[i].next = -1;}//初始化int head, N, K;scanf("%d%d%d", &head, &N, &K);int address, data, next;while (N--){scanf("%d%d%d", &address, &data, &next);node[address].data = data;node[address].next = next;//链接各节点}int count = 0;//计数器int addressNow = head;int pre;stack<record> sta;//用于暂存要被逆转连接的节点record temprecord;//保存节点地址,本来以为要保存下一个节点的地址,其实根本不需要,也不想改了就这样吧int oldLast;//上一次逆转后指向最后一个节点的指针while (addressNow!= -1){temprecord.address = addressNow;//temprecord.next = node[addressNow].next;sta.push(temprecord);pre = addressNow;addressNow = node[addressNow].next;count++;if (count%K == 0){if (count == K)head = pre;//第一个开始反转的节点成为头了if (!sta.empty()){sta.pop();}if (pre != head){node[oldLast].next = pre;}//如果不是第一个那么需要将上一次反转后的最后一个节点的下个地址做修改//将样例中的K由4改为2你就知道为什么了for (int i = 0; i < K-1; i++){node[pre].next = sta.top().address;//逆转链表pre = sta.top().address;if (!sta.empty()){sta.pop();}}node[pre].next = addressNow;//修改反转节点的最后一个节点的下一个地址,//若后面不会再反转,那么就是当前扫描的节点的地址,注意我是先计数后又把指针//往后移一位了oldLast = pre;//保存反转节点的最后一个节点的地址}}addressNow = head;while (addressNow!= -1){if(node[addressNow].next!=-1)printf("%05d %d %05d\n", addressNow, node[addressNow].data, node[addressNow].next);elseprintf("%05d %d %d\n", addressNow, node[addressNow].data, node[addressNow].next);addressNow = node[addressNow].next;}return 0;}/*注意把每次反转后的节点的下一个地址修改正确,比如说1 2 3 4 5 6,反转个数K为2时,应该是2 1 4 3 6 5,这时要记得把1跟4连上,3跟6连上。*/

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 支付宝禁止联网怎么办 手机号登录不上怎么办 电信手机号无法打电话怎么办 新手机号无法注册怎么办 电信手机怎么办流量包 qq华夏到监牢怎么办 炫舞被骗2900怎么办 qq好友申诉后怎么办 无好友辅助申请怎么办 辅助申诉成功后怎么办 qq绑不了手机号怎么办 新办号码有微信怎么办 两手机互换号后微信怎么办 手机申请不了qq怎么办 快手账号保护了怎么办 qq号过期登不上怎么办 xp 登陆界面不见了怎么办 手机号qq 别人登录怎么办 qq号申请频繁怎么办 qq号实名验证怎么办 陌陌没法注册怎么办 腾讯q币充值错误怎么办 手机号码注册微信号怎么办 q币充错了号怎么办 微信超额度提现都不可以怎么办 微信发红包转账限额怎么办 银行卡没设密码怎么办 宜人贷逾期一天怎么办 快手实名已认证怎么办 爱奇艺充会员没有银行卡怎么办 手机qq内存太大怎么办 借呗逾期半年怎么办 支付宝支付错误怎么办 小米6支付宝闪退怎么办 验证码发送失败怎么办 支付宝升级后打不开怎么办 steam支付宝失败怎么办 支付宝无响应怎么办 花呗加载失败怎么办 吃鸡平台无效怎么办 悦支付登录不了怎么办