给定一个常数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是下一结点的地址。
输出
对每个测试用例,顺序输出反转后的链表,其上每个结点占一行,格式与输入相同。
样例输入
样例输出
解题思路:刚开始题目理解错误了 并不是分2次考虑 而是一段k 一段k的考虑下去 直到结束 另外就是函数库的reverse的运用
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N=100010; 4 int pre[N],h; 5 int last[N],j; 6 int a,n,k,jishu,geshu; 7 struct Node{ 8 int ad,date,next; 9 }listt[N],*que[N]; 10 11 int main() 12 { 13 cin>>a>>n>>k; 14 for(int i=1,d1,d2,d3;i<=n;i++){ 15 cin>>d1>>d2>>d3; 16 listt[d1]={d1,d2,d3}; 17 } 18 int head=a; 19 while(head!=-1){ 20 que[++jishu]=&listt[head]; 21 head=listt[head].next; 22 } 23 if(que+1==&que[1]){ 24 cout << "xuhao" << endl; 25 } 26 for(int i=1;i<=jishu-k+1;i+=k){ 27 reverse(que+i,quei+k); //reverse里面前面的地址是第一个地址,后面的地址是最后那个元素的后一个 28 } 29 for(int i=1;i<=jishu;i++){ 30 if(i==1) printf("%05d %d ",que[i]->ad,que[i]->date); 31 else printf("%05d %05d %d ",que[i]->ad,que[i]->ad,que[i]->date); 32 } 33 printf("-1 "); 34 return 0; 35 }