1074. Reversing Linked List (25)
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 33218Sample Output:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
https://www.patest.cn/contests/pat-a-practise/1074
https://www.nowcoder.com/pat/5/problem/4033
思路:
读入,用map映射,整理出原顺序的列表
然后按块翻转,注意两块之间的处理
CODE:
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cstdlib>
#include<map>
#define N 100010
using namespace std;
map<int,int> ma;
typedef struct S
{
int addr;
int nxt;
int val;
};
S pre[N];
S no[N];
int main()
{
char bg[5];
int n,m;
int head;
scanf("%s %d %d",bg,&n,&m);
head=atoi(bg);
for (int i=0;i<n;i++)
{
char* s1=(char*)malloc(5*sizeof(char));
char* s2=(char*)malloc(5*sizeof(char));
scanf("%s %d %s",s1,&pre[i].val,s2);
pre[i].addr=atoi(s1);
pre[i].nxt=atoi(s2);
ma[pre[i].addr]=i;
}
int len=0;
int now=head;
while (now!=-1)
{
no[len]=pre[ma[now]];
now=pre[ma[now]].nxt;
len++;
}
no[len].addr=-1;
for (int i=0;i<(len/m)*m;i+=m)
{
for (int j=i+m-1;j>i;j--)
{
no[j].nxt=no[j-1].addr;
printf("%05d %d %05d\n",no[j].addr,no[j].val,no[j].nxt);
}
if (i+2*m>len)
no[i].nxt=no[i+m].addr;
else
no[i].nxt=no[i+2*m-1].addr;
if (no[i].nxt!=-1)
printf("%05d %d %05d\n",no[i].addr,no[i].val,no[i].nxt);
else
printf("%05d %d -1",no[i].addr,no[i].val);
}
for (int i=(len/m)*m;i<len;i++)
{
if (no[i].nxt!=-1)
printf("%05d %d %05d\n",no[i].addr,no[i].val,no[i].nxt);
else
printf("%05d %d -1",no[i].addr,no[i].val);
}
return 0;
}