1. 程式人生 > >pat 1025. 反轉連結串列

pat 1025. 反轉連結串列

原題連結:
一道和連結串列沒啥關係的題,沒啥難度但是很麻煩。
思路: 資料結構用結構陣列儲存,然後先把連結串列翻轉後各個節點的位置資訊儲存起來。之後直接輸出就行了,因為下一個節點的頭就是前一個節點的尾,單獨處理最後一個節點就好了。

參考程式碼:
#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; }