思路:
链表处理
代码:
#include <bits/stdc++.h>
using namespace std;
#define maxn 100010
struct node{
int add, data, nxt;
int idx;//节点序号,无效为maxn//便于排序
};
node l[100010];
int cmp(node a, node b){
return a.idx<b.idx;
}
int main()
{
for(int i=0;i<maxn;i++) l[i].idx = maxn;
int bgn, n, k, add;
cin>>bgn>>n>>k;
for(int i=0;i<n;i++){
cin>>add;
cin>>l[add].data>>l[add].nxt;
l[add].add = add;
}
int now=bgn, cnt=0;//当前节点,有效节点数
while(now!=-1){
l[now].idx = cnt++;
now = l[now].nxt;
}
sort(l, l+maxn, cmp);
for(int i=0;i<cnt/k;i++){//完整的cnt/k块
for(int j=(i+1)*k-1;j>i*k;j--)//第i块前k-1个节点倒序输出
printf("%05d %d %05d\n",l[j].add,l[j].data,l[j-1].add);
printf("%05d %d",l[i*k].add,l[i*k].data);//最后一个节点地址和数据
if(i<cnt/k-1) printf(" %05d\n",l[(i+2)*k-1].add);//若不是最后一块
else{//是最后一块
if(cnt%k==0) cout<<" "<<-1<<endl;//是最后节点
else{//剩下不完整块按原序输出
printf(" %05d\n",l[(i+1)*k].add);//上一块最后节点的nxt
for(int j=cnt/k*k;j<cnt;j++){
printf("%05d %d",l[j].add,l[j].data);
if(j<cnt-1) printf(" %05d\n",l[j+1].add);
else cout<<" "<<-1<<endl;
}
}
}
}
return 0;
}
本文介绍了一种链表处理算法,该算法将链表按指定数量进行分组,并对每组内的节点进行倒序输出。文章通过C++实现,详细展示了如何定义链表结构、如何遍历和排序链表节点以及如何实现分组反转的功能。
462

被折叠的 条评论
为什么被折叠?



