PAT 1074. Reversing Linked List (25)
2015-09-01 15:53
357 查看
1074. Reversing Linked List (25)
时间限制400 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
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 00000 4 99999 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
这道题是一个链表问题,要注意的是题目给出的数据不一定刚好是一串链表,所以在读入数据以后要从头结点对链表进行一次遍历,遍历到下一地址为“-1” 的时候停止。然后再对链表进行反转操作(实际上就是把vector给reverse了) 代码如下:
#include <iostream> #include <algorithm> #include <string> #include <vector> #include <iomanip> #include <map> #include <cstring> using namespace std; typedef struct node{ int addr; int data; int next; }node; int main(void) { int headaddr,N,K; cin>>headaddr>>N>>K; map<int,node> raw; int i=N; while(i--) { node temp; cin>>temp.addr>>temp.data>>temp.next; raw[temp.addr]=temp; } i=headaddr; if(raw.count(i)<=0) return 0; vector<node> lists; lists.push_back(raw[i]); int count=1; while(raw[i].next!=-1&&count<N) { i=raw[i].next; lists.push_back(raw[i]); count++; } int turn=lists.size()/K; vector<node>::iterator it=lists.begin(); if(K<=lists.size()) { while(turn--) { reverse(it,it+K); it+=K; } } for(i=0;i<lists.size()-1;i++) printf("%05d %d %05d\n",lists[i].addr,lists[i].data,lists[i+1].addr); printf("%05d %d -1\n",lists[lists.size()-1].addr,lists[lists.size()-1].data); }
相关文章推荐
- Objective-C学习笔记八:类的定义二
- 源码编译安装lamp环境
- HashMap java.util.ConcurrentModificationException
- HashMap遍历的两种方式
- IOS时间与日期处理
- JAVA支持HTTP断点续传
- JSP
- .Net Program Unable to copy a file from obj\Debug to bin\Debug
- Android 自定义RecyclerView 实现真正的Gallery效果
- 软件设计师2013年上半年错题整理
- 无法用排他锁锁定该数据库,以执行该操作。 (Microsoft SQL Server,错误: 5030)
- /proc/*
- Objective-C学习笔记七:类的定义一
- HDFS和MapReduce 架构分析----阿冬专栏
- 软工视频总结之需求分析
- 出现 java.util.ConcurrentModificationException
- bq2031
- 面试题20:顺时针打印矩形
- .dll,.lib,.def 和 .exp文件
- .Net Program Unable to copy a file from obj\Debug to bin\Debug