L2-022 重排链表
Statement
Metadata
- 作者: 陈越
- 单位: 浙江大学
- 代码长度限制: 16 KB
- 时间限制: 500 ms
- 内存限制: 64 MB
给定一个单链表
输入格式
每个输入包含1个测试用例。每个测试用例第1行给出第1个结点的地址和结点总个数,即正整数
接下来有
其中Address
是结点地址;Data
是该结点保存的数据,为不超过Next
是下一结点的地址。题目保证给出的链表上至少有两个结点。
输出格式
对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。
输入样例
输出样例
Solution
#include <ctype.h>
#include <algorithm>
#include <climits>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <deque>
#include <iomanip>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <string>
#include <vector>
#define CLR(a) memset(a, 0, sizeof(a))
#define pb push_back
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<string, int> psi;
typedef pair<string, string> pss;
const double PI = 3.14159265358979323846264338327;
const double E = exp(1);
const double eps = 1e-6;
const int INF = 0x3f3f3f3f;
const int maxn = 1e6 + 5;
const int MOD = 1e9 + 7;
int pos[maxn];
struct Node {
int add;
int value;
int next;
} temp;
vector<Node> ans, vis, v;
map<int, Node> m;
void dfs(int add) {
vis.pb(m[add]);
if (m[add].next != -1)
dfs(m[add].next);
}
int main() {
int ini, n;
scanf("%d%d", &ini, &n);
for (int i = 0; i < n; i++) {
scanf("%d %d %d", &temp.add, &temp.value, &temp.next);
m[temp.add] = temp;
}
dfs(ini);
int l = 0, r = vis.size() - 1;
while (1) {
if (r < l)
break;
ans.pb(vis[r]);
r--;
if (r < l)
break;
ans.pb(vis[l]);
l++;
}
n = ans.size() - 1;
for (int i = 0; i < n; i++) printf("%05d %d %05d\n", ans[i].add, ans[i].value, ans[i + 1].add);
printf("%05d %d -1\n", ans[n].add, ans[n].value);
// if (n & 1)
// {
// int mid = (n + 1) / 2;
// for (int i = 1, j = n; i < mid; i++, j--)
// {
// ans.pb(vis[j]);
// ans.pb(vis[i]);
// }
// ans.push_back(vis[mid]);
// n = ans.size() - 1;
// for (int i = 0; i < n; i++)
// printf("%05d %d %05d\n", ans[i].add, ans[i].value, ans[i + 1].add);
// printf("%05d %d -1\n", ans[n].add, ans[n].value);
// }
// else
// {
// int mid = n / 2;
// for (int i = 1, j = n; i <= mid; i++, j--)
// {
// ans.pb(vis[j]);
// ans.pb(vis[i]);
// }
// n = ans.size() - 1;
// for (int i = 0; i < n; i++)
// printf("%05d %d %05d\n", ans[i].add, ans[i].value, ans[i + 1].add);
// printf("%05d %d -1\n", ans[n].add, ans[n].value);
// }
}
Last update: May 4, 2022