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;
}
posted @ 2026-03-15 18:00  shuiwangrenjia  阅读(1)  评论(0)    收藏  举报