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 68237

68237 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