7-2 Reversing Linked List (25分)

 

 

 

 解题思路:

1、结点地址是固定5位整数,故可用数组按结点地址存放

2、利用辅助数组存放排好序的链表(不在链表上的多余结点不处理),当k=1时,链表不翻转,k>1时按要求翻转链表

#include <stdio.h>
#define Max 100000
typedef struct {
    int Addr;
    int Data;
    int Next;
} Node[Max];
int main() {
    int n,k,i,j=0,t=0,pos,cnt;
    scanf("%d%d%d",&pos,&n,&k);
    Node list,tmp;
    int x,y,z;
    for(i=0; i<n; i++) {
        scanf("%d%d%d",&x,&y,&z);
        list[x].Addr=x;
        list[x].Data=y;
        list[x].Next=z;
    }
    while(pos!=-1) {
        tmp[j++]=list[pos];
        pos=list[pos].Next;
    }
    if(k>1) {
        cnt=j/k;
        int s=0,r=j%k;
        while(cnt--) {
            for(i=s+k-1; i>s; i--) {
                tmp[i].Next=tmp[i-1].Addr;
                list[t++]=tmp[i];
            }
            if(s+2*k<=j) {
                tmp[i].Next=tmp[s+2*k-1].Addr;
                list[t++]=tmp[i];
                s+=k;
            }
        }
        if(r) {
            tmp[i].Next=tmp[j-r].Addr;
            list[t++]=tmp[i];
        } else {
            tmp[i].Next=-1;
            list[t++]=tmp[i];
        }
        while(t<j) {
            list[t++]=tmp[j-r];
            r--;
        }
        for(i=0; i<t; i++) {
            if(i!=t-1)
                printf("%05d %d %05d\n",list[i].Addr,list[i].Data,list[i].Next);
            else
                printf("%05d %d %d\n",list[i].Addr,list[i].Data,list[i].Next);
        }
    } else {
        for(i=0; i<j; i++) {
            if(i!=j-1)
                printf("%05d %d %05d\n",tmp[i].Addr,tmp[i].Data,tmp[i].Next);
            else
                printf("%05d %d %d\n",tmp[i].Addr,tmp[i].Data,tmp[i].Next);
        }
    }

    return 0;
}

 

posted @ 2020-04-23 15:25  跃鱼  阅读(406)  评论(0编辑  收藏  举报