Given a constant K and a singly linked list L, you are supposed to reverse the links of every K elements on L. For example, given L being 1→2→3→4→5→6, if K = 3, then you must output 3→2→1→6→5→4; if K = 4, you must output 4→3→2→1→5→6.
Input Specification:
Each input file contains one test case. For each case, the first line contains the address of the first node, a positive N (<= 105) which is the total number of nodes, and a positive K (<=N) which is the length of the sublist to be reversed. The address of a node is a 5-digit nonnegative integer, and NULL is represented by -1.
Then N lines follow, each describes a node in the format:
Address Data Next
where Address is the position of the node, Data is an integer, and Next is the position of the next node.
Output Specification:
For each case, output the resulting ordered linked list. Each node occupies a line, and is printed in the same format as in the input.
Sample Input:
00100 6 4
00000 4 99999
00100 1 12309
68237 6 -1
33218 3 00000
99999 5 68237
12309 2 33218
Sample Output:
00000 4 33218
33218 3 12309
12309 2 00100
00100 1 99999
99999 5 68237
68237 6 -1
1、本题是栈和队列的结合,我使用了vector代替队列,功能一致。
2、注意case6,有的节点不在链中,所以需要先算出链条长度。
#include <iostream>
#include <map>
#include <vector>
#include<stack>
using namespace std;
struct node
{
int ad,num,next;
node(){}
node(int a,int nu,int ne){
ad=a,num=nu,next=ne;
}
};
node mnode[100005];
int main(){
freopen("in.txt","r",stdin);
int start,n,m;
stack<node> out;
vector<node> out2;
while(scanf("%d%d%d",&start,&n,&m)!=EOF)
{
int tad,tnum,tnext;
for(int i=0;i<n;i++)
{
cin>>tad>>tnum>>tnext;
mnode[tad]=node(tad,tnum,tnext);
}
}
int now=start,i,t=start,cnt=0;
n=0;
while(t!=-1){//计算链条长度
n++;
t=mnode[t].next;
}
for(i=0;i+m<=n;i+=m){
for(int j=i;j<i+m;j++){
out.push(mnode[now]);
now=mnode[now].next;
}
while(!out.empty()){
out2.push_back(out.top());
out.pop();
}
}
for(;i<n;i++){
out2.push_back(mnode[now]);
now=mnode[now].next;
}
for(int i=0;i<out2.size()-1;i++){
printf("%05d %d %05d\n",out2[i].ad,out2[i].num,out2[i+1].ad);
}
printf("%05d %d -1\n",out2[n-1].ad,out2[n-1].num);
return 0;
}