给定一个常数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 6823768237 6 -1
怎么进行反转其实挺简单的,注意下特殊情况就行。关键在于怎么按照链表顺序进行排序。
一开始自己写了一个版本大概就是最基本的蛮力排序,果不其然超时了,最后参考了下别人的思路(http://blog.csdn.net/qq_32511479/article/details/53457792)进行了
修改通过。
此外注意此题有个坑爹之处,最后一个case会有多余的数据输入。
22分版本(case 5 超时):
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; struct node{ string addr; int x; string nextaddr; }; int main(){ string add1; int N,K,i,j,m,n,q=1; vector<node> v; cin>>add1>>N>>K; node s0; s0.addr=add1; s0.x=0; s0.nextaddr='0'; v.push_back(s0); for(i=0;i<N;i++){ string a,b; int c; node s; cin>>a>>c>>b; if(a==add1){ v[0].addr=a; v[0].x=c; v[0].nextaddr=b; } else{ s.addr=a; s.x=c; s.nextaddr=b; v.push_back(s); } } for(i=0;i<N;i++){ int k=0; for(j=i+1;j<N;j++){ if(v[i].nextaddr==v[j].addr){ node p; p=v[i+1]; v[i+1]=v[j]; v[j]=p; q++; k=1; break; } } if(k==0)break; } N=q; m=K; for(i=0;i<N/K;i++){ n=m-1; for(j=0;j<K-1;j++){ cout<<v[n].addr<<' '<<v[n].x<<' '<<v[n-1].addr<<endl; n--; } cout<<v[n].addr<<' '<<v[n].x<<' '; if(i==N/K-1)cout<<v[m-1].nextaddr<<endl; else cout<<v[m+K-1].addr<<endl; m+=K; } for(i=m-K;i<N;i++)cout<<v[i].addr<<' '<<v[i].x<<' '<<v[i].nextaddr<<endl; return 0; }
AC版本:#include <iostream> #include <iomanip> #include <vector> #include <algorithm> using namespace std; struct node{ int addr; int x; int nextaddr; int order; }; bool cmp(node y,node z){ return y.order<z.order; } int main(){ int N,K,i,j,m,n,p,q=0; node s0; s0.addr=0; s0.x=0; s0.nextaddr=0; s0.order=100001; vector<node> v(100000,s0); cin>>p>>N>>K; for(i=0;i<N;i++){ int a,b,c; node s; cin>>a>>c>>b; v[a].addr=a; v[a].x=c; v[a].nextaddr=b; } while(p!=-1){ q++; v[p].order=q; p=v[p].nextaddr; } sort(v.begin(),v.end(),cmp); N=q; m=K; for(i=0;i<N/K;i++){ n=m-1; for(j=0;j<K-1;j++){ cout<<setfill('0')<<setw(5)<<v[n].addr<<' '<<v[n].x<<' '; cout<<setfill('0')<<setw(5)<<v[n-1].addr<<endl; n--; } cout<<setfill('0')<<setw(5)<<v[n].addr<<' '<<v[n].x<<' '; if(i==N/K-1){ if(v[m-1].nextaddr==-1)cout<<-1<<endl; else cout<<setfill('0')<<setw(5)<<v[m-1].nextaddr<<endl; } else cout<<setfill('0')<<setw(5)<<v[m+K-1].addr<<endl; m+=K; } for(i=m-K;i<N;i++){ cout<<setfill('0')<<setw(5)<<v[i].addr<<' '<<v[i].x<<' '; if(v[i].nextaddr==-1)cout<<-1<<endl; else cout<<setfill('0')<<setw(5)<<v[i].nextaddr<<endl; } return 0; }