最初的想法:初始链表,12345…n,重排后 n1(n-1)2(n-2)3…,不能够局限于链表重排的实现,链表是及其麻烦的,我们用结构体模拟链表。开了一个结构数组进行输入,下标是地址,还包括数据域,和下一个地址。在开另外两个结构数组,来记录123 … n/2 和 n(n-1)(n-2) … ceil(n/2.0),其中,记录第二个结构数组时,采用倒叙记录,方便和第一个下边保持一致。
结果:测试点 3 没过,查阅资料才知道,是输入的时候有许多多余的数据进入了表中,我们一直反复在用 n,但是我们应该用 n 有效值,循坏遍历,算出有效值 n。
Code#includeusing namespace std; struct node { int data; int next; } a[100010], s[100010]; struct f { int data; int address; } b[50010], c[50010]; int main() { int head, n; cin >> head >> n; for(int i = 1; i <= n; i++) { int x, y, z; cin >> x >> y >> z; s[x].data = y; s[x].next = z; } int q = head; n = 0; while(q != -1) { n++; a[q].data = s[q].data; a[q].next = s[q].next; q = a[q].next; } int p, cnt = 1, bk = 0, ck = ceil(n / 2.0); for(p = head, bk = 1; bk <= n / 2; bk++, p = a[p].next) { b[bk].data = a[p].data; b[bk].address = p; } // cout << a[p].data << "n"; for(ck = ceil(n / 2.0); p != -1;ck--, p = a[p].next) { c[ck].data = a[p].data; c[ck].address = p; } // for(int i = 1; i <= n / 2; i++) // cout << b[i].data << " "; // cout << "n"; // cout << ck << " " << ceil(n / 2.0) << "n"; // for(int i = 1; i <= ceil(n / 2.0); i++) // cout << c[i].data << " "; // cout << "n"; for(int i = 1; i <= ceil(n / 2.0); i++) { //cout << c[i].address << " " << c[i].data << " "; printf("%05d %d ", c[i].address, c[i].data); if(i < bk) //cout << b[i].address << "n" << b[i].address << " " << b[i].data << " "; printf("%05dn%05d %d ", b[i].address, b[i].address, b[i].data); if(i == ceil(n / 2.0)) cout << "-1n"; else //cout << c[i + 1].address << "n"; printf("%05dn", c[i + 1].address); } }
根据柳婼的代码,修改了一下。“l, r代表将要输出的节点位置,当(l-1)-(r+1) == 1时都遍历一遍了,可退出循环。” 确实难理解,QwQ!分奇偶,多画画。
#include#include using namespace std; struct node{ int id, data, next; }; int main() { int begin, n; cin >> begin >> n; node a[100010]; vector v, ans; for(int i = 0; i < n; i++) { int tbegin, tdata, tnext; cin >> tbegin >> tdata >> tnext; a[tbegin] = {tbegin, tdata, tnext}; } while(begin != -1) { v.push_back(a[begin]); begin = a[begin].next; } int l = 0, r = v.size() - 1; while(l <= r) { ans.push_back(v[r]); r--; if(r < l) break; //if((r + 1) - (l - 1) == 1) break; ans.push_back(v[l]); l++; if(r < l) break; //if((r + 1) - (l - 1) == 1) break; } // cout << r << " " << l << "n"; for(int i = 0; i < ans.size(); i++) { if(i != ans.size() - 1) printf("%05d %d %05dn", ans[i].id, ans[i].data, ans[i+1].id); else printf("%05d %d -1n", ans[i].id, ans[i].data); } return 0; }



