1074 Reversing Linked List
题目大意
读入一条链表,遍历该链表,将链表上的结点按照每m个结点为一组进行反转,按顺序输出反转后的链表的每一个结点
核心思路
从begin开始遍历链表上的每一个结点,将链表上每一个结点的address放到vector数组v中,对vector数组v的每m个元素为一组进行反转操作。
然后就可以按照vector数组v的元素顺序输出每个结点的address、key、下一个结点的address。
代码
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
const int maxn=100000;
struct Node{
int address;
int key;
int next;
}node[maxn];
vector<int> v;
int main(){
//读入首结点address,结点数量和输出间隔
int begin,n,m;
cin>>begin>>n>>m;
//读入所有的结点
for(int i=0;i<n;i++){
int a,b,c;
cin>>a>>b>>c;
node[a]={a,b,c};
}
//过滤掉不在链表上的结点,同时记录有效结点的个数
int cnt=0;
for(int p=begin;p!=-1;p=node[p].next){
v.push_back(p);
cnt++;
}
//在数组v中把所有结点的address按题目要求排序
for(int i=0;i+m-1<cnt;i=i+m){
reverse(v.begin()+i,v.begin()+i+m);//左闭右开
}
//输出
for(int i=0;i<cnt;i++){
if(i!=cnt-1){
printf("%05d %d %05d\n",v[i],node[v[i]].key,node[v[i+1]].address);
}else{
printf("%05d %d -1\n",v[i],node[v[i]].key);
}
}
}