1025 反转链表 (25)(25 分)
给定一个常数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是下一结点的地址。
输出格式:
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
我只能说这个反转链表有点恶心啊,我自己想了半天都没有看懂题意也是emmmm,(注意一点:整数可以是打乱顺序的,题目只是为了方便才那样的,不要用sort()那个方法,好好读题目吧)
这个题是要根据整数的Address地址进行排序,排序后进行反转,C++有反转函数方法,这个反转不能达到题目要求的,但是第一个数的Next地址是第二个数的Address,所以反转之后,在输出的时候,把下一个数的Address放到这个数的Next进行输出,最后一个数进行判断填上-1即可。
#include<iostream>
#include<vector>
#include<algorithm>
#define N 100005
using namespace std;
struct node{
int yuan;
int t;
int next;
};
struct Data{
int t;
int next;
};
int main(){
int n,a,b,q,p,k;
node temp;
Data D[N];
vector<node> in;
vector<node> ou;
int first;
cin>>first>>n>>k;
for(int i=0;i<n;i++){
cin>>temp.yuan>>temp.t>>temp.next;
in.push_back(temp);
if(temp.yuan==-1){
continue;
}
D[temp.yuan].t=temp.t;
D[temp.yuan].next=temp.next;
}
b=first;
while(1)
{
node m;
m.yuan=b;
m.t=D[b].t;
m.next=D[b].next;
ou.push_back(m);
if(D[b].next==-1){
break;
}
b=D[b].next;
}
for(int i=0;i<ou.size()/k;i++){
reverse(ou.begin()+i*k,ou.begin()+(i+1)*k);
}
for(int i=0;i<ou.size();i++){
if(i==ou.size()-1){
printf("%05d %d -1
",ou[i].yuan,ou[i].t);
}
else {
printf("%05d %d %05d
",ou[i].yuan,ou[i].t,ou[i+1].yuan);
}
}
return 0;
}