1025. 反转链表 (25)
时间限制
300 ms
内存限制
32000 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 4 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218输出样例:
00000 4 33218 33218 3 12309 12309 2 00100 00100 1 99999 99999 5 68237 68237 6 -1
//=========code============//
#include<stdio.h>
#include<string.h>
struct list_value { char add_self[5]; int d; char add_next[5]; }; void sort(struct list_value p[10000],int str[10000],char add[5],int n,int value[1]) { int i,j=0; for(i=0;i<n;i++) while(add[0]!='-'&&add[1]!='1') { for(i=0;i<n;i++) { if(strcmp(add,p[i].add_self)==0) break; } str[j++]=i; value[0]++; strcpy(add,p[i].add_next); } } int main() { char add_fir[5]={0}; int nu_all,nu_value; scanf("%s%d%d",add_fir,&nu_all,&nu_value); struct list_value p[100000]; int i,j,value[1]={0}; for(i=0;i<nu_all;i++) scanf("%s%d%s",p[i].add_self,&p[i].d,p[i].add_next); int str[100000]={0}; sort(p,str,add_fir,nu_all,value); int n=value[0]/nu_value; for(i=0;i<n*nu_value;i+=nu_value) for(j=0;j<nu_value;j++) printf("%s %d %s\n",p[str[i+nu_value-j-1]].add_self,p[str[i+nu_value-1-j]].d,p[str[j<nu_value-1?i+nu_value-j-2:i+nu_value]].add_self); for(i=0;i<value[0]-n*nu_value;i++) printf("%s %d %s\n",p[str[n*nu_value+i]].add_self,p[str[n*nu_value+i]].d,p[str[n*nu_value+i]].add_next); return 0; }