您的位置:首页 > 其它

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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: