L2-022 重排链表 给定一个单链表 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
是该结点保存的数据,为不超过105的正整数;Next
是下一结点的地址。题目保证给出的链表上至少有两个结点。
输出格式: 对每个测试用例,顺序输出重排后的结果链表,其上每个结点占一行,格式与输入相同。
输入样例: 1 2 3 4 5 6 7 00100 6 00000 4 99999 00100 1 12309 68237 6 -1 33218 3 00000 99999 5 68237 12309 2 33218
输出样例: 1 2 3 4 5 6 68237 6 00100 00100 1 99999 99999 5 12309 12309 2 00000 00000 4 33218 33218 3 -1
思路:
C++代码: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 #include <map> #include <set> #include <regex> #include <stack> #include <queue> #include <math.h> #include <vector> #include <cstdio> #include <string> #include <cstring> #include <sstream> #include <iomanip> #include <iostream> #include <algorithm> #include <unordered_map> using namespace std;typedef long long ll;const int INF = 0x3f3f3f3f ;const int dir[4 ][2 ] = { {1 ,0 } ,{-1 ,0 },{0 ,1 },{0 ,-1 } }; typedef struct node { string address; int data; string next; node () { } node (string address, int data, string next) { this ->address = address; this ->data = data; this ->next = next; } }node, * pnode; node nodes[100010 ]; int main () { int n; int start; cin >> start >> n; for (int i = 0 ; i < n; i++) { string t_address, t_next; int t_data; cin >> t_address >> t_data >> t_next; int t = stoi (t_address); nodes[t] = node (t_address, t_data, t_next); } vector<node> t; while (start != -1 ) { t.push_back (nodes[start]); start = stoi (nodes[start].next); } int l = 0 ; int r = t.size () - 1 ; int cnt = 1 ; vector<node> ans; while (l <= r) { if (cnt & 1 ) { ans.push_back (t[r--]); } else { ans.push_back (t[l++]); } cnt++; } for (int i = 0 ; i < ans.size (); i++) { if (i == ans.size () - 1 ) { cout << ans[i].address << " " << ans[i].data << " -1" << endl; continue ; } cout << ans[i].address << " " << ans[i].data << " " << ans[i + 1 ].address << endl; } return 0 ; }