L2-022 重排链表 (25 分)
给定一个单链表 L1→L2→⋯→Ln−1→Ln,请编写程序将链表重新排列为 Ln→L1→Ln−1→L2→⋯。例如:给定L为1→2→3→4→5→6,则输出应该为6→1→5→2→4→3。
输入格式:
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数N (≤105)。结点的地址是5位非负整数,NULL地址用−1表示。
接下来有N行,每行格式为:
Address Data Next
讯享网
其中Address是结点地址;Data是该结点保存的数据,为不超过105的正整数;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<bits/stdc++.h> using namespace std; const int inf = ; typedef struct{ int data; int next; }TT; TT a[]; typedef struct{ int add; int data; int next; }T; int main(){ T kk; queue<T> kkk; map<int,T> k; int n,m; cin>>m>>n; int op,p,o; int mer; /*接下来的for循环与while循环的作用就是将有效的节点放在队列kkk中*/ for(int i=0;i!=n;++i){ scanf("%d %d %d",&op,&o,&p); a[op].data=o; a[op].next=p; } while(m!=-1){ kk.add=m; kk.data=a[m].data; kk.next=a[m].next; m=a[m].next; kkk.push(kk); } int i=0; int dd=kkk.size();//kkk的size()就是有效的节点数(可能给的节点不再单链表中,所以这个节点不会被 //存储在队列kkk中) int c=kkk.size()-1; while(!kkk.empty()){ k[++i]=kkk.front(); kkk.pop(); } printf("%05d %d ",k[dd].add,k[dd].data); printf("%05d\n%05d %d ",k[1].add,k[1].add,k[1].data); while(c>dd/2){ printf("%05d\n%05d %d ",k[c].add,k[c].add,k[c].data); if(c==dd+1-c) break; printf("%05d\n%05d %d ",k[dd+1-c].add,k[dd-c+1].add,k[dd-c+1].data); c--; } printf("-1"); }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/26948.html