【PAT】1025 反轉連結串列(25)basic
阿新 • • 發佈:2019-02-18
題目地址:http://pat.zju.edu.cn/contests/pat-b-practise/1025
/* 1.設定錄入的vector足夠大,直接把vector的index與節點的address匹配,這在節點數很少的情況下可用; 2.從給定頭結點指標開始,順序找到整個鏈,儲存在vsorted,要注意有些節點可能是廢節點,所以排序後找出來的鏈長度可能小於初始錄入的節點數目 3.將排序後的節點每K個為單位錄入到要輸出的最後結果的vector中(表示為vout),注意剩餘不足K個節點順序新增到後邊; 4.修改除最後一個節點之外的所有節點的next指標,並輸出每個節點資訊; 5.輸出最後一個節點資訊,注意next為-1 */ #include<string.h> #include<stdio.h> #include<stdlib.h> #include<iostream> #include<vector> #include<algorithm> using namespace std; typedef long long ll; struct node{ int address; int val; int next; }tmp; int main(){ vector<node>vin(100006); vector<node>vsort; vector<node>vout; int first,n,k,i,j; while(scanf("%d%d%d",&first,&n,&k)!=EOF){ for(i=0;i<n;i++){ scanf("%d%d%d",&tmp.address,&tmp.val,&tmp.next); vin[tmp.address]=tmp; } if(first==-1){ printf("-1\n"); continue; } while(first!=-1){ vsort.push_back(vin[first]); first=vin[first].next; } int len=vsort.size(); /*for(int ii=0;ii<len;ii++){ printf("*** %05d %d %05d\n",vsort[ii].address,vsort[ii].val,vsort[ii].next); }*/ for(i=k;i<=len;i+=k){ for(j=i-1;j>=i-k;j--){ vout.push_back(vsort[j]); } } for(j=(len/k)*k;j<len;j++){ vout.push_back(vsort[j]); } /*for(int ii=0;ii<len;ii++){ printf("^^^ %05d %d %05d\n",vout[ii].address,vout[ii].val,vout[ii].next); }*/ for(i=0;i<len-1;i++){ vout[i].next=vout[i+1].address; printf("%05d %d %05d\n",vout[i].address,vout[i].val,vout[i].next); } if(len>=1)printf("%05d %d -1\n",vout[len-1].address,vout[len-1].val); } return 0; } /* 00100 6 1 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218 */