L2-022 重排链表
解题思路
这道题需要先构建一个链表,然后按顺序存放到数组中,再用前后两个指针往中间靠拢,先把右边的加入,再加左边。
每加入一个,都要检查链表是否已经遍历完了,如果遍历完了,(l == r)就成了,这时候直接break。
最后直接遍历这个数组输出就行了,输出的时候,要输出当前节点的地址,值,和下一个节点的地址,每个节点的ne不能再用了
本题难点:如果把链表按正确的顺序存进一个数组;
(我刚开始竟然没想到用双指针ε=(´ο`*)))唉 , 那就罚自己打把csgo吧😋)
ac✅️代码
#include<iostream>
#include<vector>
using namespace std;
//本题与L2-002可放一起品味
struct node
{
int id,data,next;
}a[100010];
vector<node> v,ans;
int main()
{
int begin,n;
cin>>begin>>n;
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(1)
{
ans.push_back(v[r]);
if(l == r) break;//如果一共奇数个,最后一个放进去的是右边的数
r--;
ans.push_back(v[l]);//如果一共偶数个,最后一个放进去的是左边。
if(l == r) break;
l++;
if((r + 1) - ( l - 1 ) == 1) break;
}
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;
}

浙公网安备 33010602011771号