L2-022 重排链表 (22->25分,前向星)

传送门

22分代码:

#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
const int INF=0x3f3f3f3f;
using namespace std;
typedef long long ll;
//
const int N=1e5+5;
struct node{
    
    
    int st,data,ed;
}a[N],b[N];
int start,n;
vector<int> v;

int main(){
    
    
    cin>>start>>n;
    f(i,0,n){
    
    
        int t;cin>>t;
        a[t].st=t;
        cin>>a[t].data>>a[t].ed;
    }
    f(i,0,n){
    
    
        b[i].st= (!i) ?start:b[i-1].ed;
        b[i].data=a[b[i].st].data;
        b[i].ed=a[b[i].st].ed;
    }
    int num=n,p1=0,p2=n-1;
    while(num>0){
    
    
        if(num>0){
    
    
            v.push_back(b[p2].st);
            v.push_back(b[p2].data);
            v.push_back(b[p1].st);
        }
        num--;p2--;
        if(num>0){
    
    
            v.push_back(b[p1].st);
            v.push_back(b[p1].data);
            v.push_back(b[p2].st);
        }
        num--;p1++;
    }

    f(i,0,v.size()){
    
    
        if(i!=v.size()-3)
            printf("%05d %d %05d\n",v[i],v[i+1],v[i+2]);
        else
            printf("%05d %d -1\n",v[i],v[i+1]);
        i+=2;
    }
    return 0;
}

错误原因:

有多余节点,需要想办法先构建出整个链表,采用链式前向星

ac代码:

#include <bits/stdc++.h>
#define f(i,a,b) for(int i=a;i<b;i++)
#define ff(i,a,b) for(int i=a;i<=b;i++)
#define debug(x) cout<<#x<<" : "<<x<<endl;
using namespace std;
//
const int N=1e5+5;
int e[N],ne[N],dat[N],h[N],idx=0;
int st,n;
int order[N],num=0;

void add(int x,int y,int da){
    
    
    dat[x]=da;
    if(y!=-1)
        e[idx]=y,ne[idx]=h[x],h[x]=idx++;
}

int main(){
    
    
    memset(h,-1,sizeof h);
    cin>>st>>n;
    f(i,0,n){
    
    
        int x,da,y;
        cin>>x>>da>>y;
        add(x,y,da);
    }
    
    order[num++]=st;
    for(int i=h[st];~i;i=h[e[i]]){
    
    
        order[num++]=e[i];
    }
    
    int i=0,j=num-1;
    while(i<j){
    
    
        printf("%05d %d %05d\n",order[j],dat[order[j]],order[i]);
        if(i+1!=j)
            printf("%05d %d %05d\n",order[i],dat[order[i]],order[j-1]);
        else
            printf("%05d %d %d\n",order[i],dat[order[i]],-1);
        i++,j--;
    }
    if(i==j)
        printf("%05d %d %d\n",order[i],dat[order[i]],-1);
}

更简洁的写法(借鉴博客:1165 Block Reversing):

#include <bits/stdc++.h>
#define debug(x) cout<<#x<<":"<<x<<endl;
#define f(i,a,n) for(int i=a;i<n;++i)
#define ff(i,a,n) for(int i=a;i<=n;++i)
const int INF=0x3f3f3f3f;
using namespace std;
typedef long long ll;
//

using namespace std;

const int N = 100010;

int n;
int h, e[N], ne[N];

int main(){
    
    
    scanf("%d%d", &h, &n);

    for (int i = 0; i < n; i ++ ){
    
    
        int adr, data, next;
        scanf("%d%d%d", &adr, &data, &next);
        e[adr] = data, ne[adr] = next;
    }

    vector<int> q,q2;
    for (int i = h; ~i; i = ne[i]) q.push_back(i);

    while (1){
    
    
        if(!q.size())break;
        q2.push_back(q[q.size()-1]);q.erase(q.end()-1);
        if(!q.size())break;
        q2.push_back(q[0]);q.erase(q.begin());
    }

    for (int i = 0; i < q2.size(); i ++ ){
    
    
        printf("%05d %d ", q2[i], e[q2[i]]);
        if (i + 1 == q2.size()) puts("-1");
        else printf("%05d\n", q2[i + 1]);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_45550375/article/details/124183174