L2-022 重排链表
Problem
Solution
最初的想法:初始链表,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
#include <bits/stdc++.h>
using 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("%05d\n%05d %d ", b[i].address, b[i].address, b[i].data);
if(i == ceil(n / 2.0)) cout << "-1\n";
else //cout << c[i + 1].address << "\n";
printf("%05d\n", c[i + 1].address);
}
}
根据柳婼的代码,修改了一下。“l, r代表将要输出的节点位置,当(l-1)-(r+1) == 1时都遍历一遍了,可退出循环。” 确实难理解,QwQ!分奇偶,多画画。
#include <iostream>
#include <vector>
using namespace std;
struct node{
int id, data, next;
};
int main() {
int begin, n;
cin >> begin >> n;
node a[100010];
vector<node> 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 %05d\n", ans[i].id, ans[i].data, ans[i+1].id);
else
printf("%05d %d -1\n", ans[i].id, ans[i].data);
}
return 0;
}