1025. 反转链表 (25)
来源:互联网 发布:哈密顿改良圈算法 编辑:程序博客网 时间:2024/06/13 12:07
给定一个常数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 400000 4 9999900100 1 1230968237 6 -133218 3 0000099999 5 6823712309 2 33218输出样例:
00000 4 3321833218 3 1230912309 2 0010000100 1 9999999999 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;}
0 0
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1025. 反转链表 (25)
- 1024. 科学计数法 (20)
- CSS盒子模型
- 【The Most Important】浅谈JSP表单Post方式中文乱码问题
- Radar Installation POJ - 1328
- 1078. Hashing (25) PAT甲级
- 1025. 反转链表 (25)
- Unity3D协程介绍 以及 使用
- 在MyEclipse下关联jar源代码
- Cornfields POJ - 2019
- 旋转卡壳,凸包直径(正方形,LA 4728)
- 【初码干货】关于.NET玩爬虫这些事
- 再也不用CSDN了!!!!!!
- 继承
- Git高级进阶