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\n",ou[i].yuan,ou[i].t);
		}
		else {
			printf("%05d %d %05d\n",ou[i].yuan,ou[i].t,ou[i+1].yuan);
		}	
	}
	return 0;
}