原题链接:
一道和链表没啥关系的题,没啥难度但是很麻烦。
思路: 数据结构用结构数组存储,然后先把链表翻转后各个节点的位置信息保存起来。之后直接输出就行了,因为下一个节点的头就是前一个节点的尾,单独处理最后一个节点就好了。
参考代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn=100005;
struct Node{
int address,next,val;
}Node[maxn];
int n,k,head,id=0;
int pos[maxn],v[maxn];
vector<int>p;
void print(){
for(int i=0;i<id-1;i++){
printf("%05d %d %05d\n",Node[p[i]].address,Node[p[i]].val,Node[p[i+1]].address);
}
printf("%05d %d -1\n",Node[p[id-1]].address,Node[p[id-1]].val);
}
void solve(){
int i=1,cnt=k;;
while(i+k-1<=id){
for(int j=0;j<k;j++){
p.push_back(i+cnt-1);
cnt--;
}
cnt=k;
i+=cnt;
}
for(int j=i;j<=id;j++){
p.push_back(j);
}
/*
for(int i=0;i<id;i++){
cout<<p[i]<<endl;
}
*/
print();
}
int main(){
//freopen("in.txt","r",stdin);
cin>>head>>n>>k;
int A,D,N;
for(int i=0;i<n;i++){
cin>>A>>D>>N;
pos[A]=N;
v[A]=D;
}
while(head!=-1){
id++;
Node[id].address=head;
Node[id].val=v[head];
Node[id].next=pos[head];
head=pos[head];
}
solve();
return 0;
}