【1074 25 链表】 Reversing Linked List

传送门

题意

给定链表中的\(n\)个节点,每个节点有地址、数据、下一节点地址,给定一个\(k\),将链表中每\(k\)个进行翻转,最后输出

数据范围

\(n\leq 10^{5},k\leq n\)

题解

  • 三个数据分开存储
  • 给出的节点有不再链表中的,将在链表中的地址加入vector
  • 利用reverse将地址进行翻转即可,vector需要左边界以\(0\)为起点,右边界以\(1\)

Code

#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int data[N],ne[N];
int main(){
    int now,n,k; cin>>now>>n>>k;
    for(int i=0;i<n;i++){
        int a,b,c; cin>>a>>b>>c;
        data[a]=b; ne[a]=c;
    }
    vector<int>list;
    while(now!=-1){
        list.push_back(now);
        now=ne[now];
    }
    int times=list.size()/k;
    for(int i=0;i<times;i++) 
        reverse(list.begin()+i*k,list.begin()+i*k+k);
    for(int i=0;i<list.size();i++) {
        printf("%05d %d ",list[i],data[list[i]]);
        if(i==list.size()-1) printf("-1");
        else printf("%05d\n",list[i+1]);
    }
}
posted @ 2021-03-03 17:08  Hyx'  阅读(68)  评论(0)    收藏  举报