反转链表 pta

给定一个常数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 }
View Code
原文地址:https://www.cnblogs.com/qq-1585047819/p/10882492.html