PTA 7-1 重排链表 (25 分)

    xiaoxiao2022-07-02  76

    给定一个单链表 L​1​​→L​2​​→⋯→L​n−1​​→L​n​​,请编写程序将链表重新排列为 L​n​​→L​1​​→L​n−1​​→L​2​​→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。

    输入格式:

    每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤10​5​​)。结点的地址是5位非负整数,NULL地址用−1表示。

    接下来有N行,每行格式为:

    Address Data Next

    其中Address是结点地址;Data是该结点保存的数据,为不超过10​5​​的正整数;Next是下一结点的地址。题目保证给出的链表上至少有两个结点。

    输出格式:

    对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。

    输入样例:

    00100 6 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218

    输出样例:

    68237 6 00100 00100 1 99999 99999 5 12309 12309 2 00000 00000 4 33218 33218 3 -1 #include<cstdio> #include<iostream> #include<string> #include<vector> #include<algorithm> using namespace std; const int maxn=1e5+10; struct Node{ int ad,next,data; }mes[maxn],ans[maxn]; int main(){ int f,n,a; scanf("%d%d",&f,&n); for(int i=0;i<n;i++){ scanf("%d",&a); scanf("%d%d",&mes[a].data,&mes[a].next); } int r=1; while(f!=-1){ ans[r].ad=f; ans[r++].data=mes[f].data; //printf("f=d\n",f); f=mes[f].next; } for(int i=1;i<r;i++){ if(i%2==1) mes[i]=ans[r-1-i/2]; else mes[i]=ans[i/2]; } for(int i=1;i<r-1;i++){ printf("d %d d\n",mes[i].ad,mes[i].data,mes[i+1].ad); } printf("d %d -1\n",mes[r-1].ad,mes[r-1].data); return 0; }

    最简单的方法是建立大小为100000的数组,再将输入的地址作为数组的索引,data值作为数组的值。

    最新回复(0)