L2-022 重排链表 静态链表 两种方法

思路

用地址做下标
查的时候直接用下标
再用一个vector存顺序弄好的链表
再搞一个node数组放ans

开了两个数组 一个vector
vector放中间结果 过度作用
mid和ans记住的都是id
mid是正常顺序的 ans是乱序的
期间一直有个点不对 经过无数次的尝试之后 。。。
md!!! 测试点3竟然是 第1个结点的地址在数据中没有!!!没有!!!dog…very dog
00100 1
00000 4 -1

1.常规法


#include <iostream>
#include <vector>
using namespace std;
struct node
{
    int data, next;
};
int main()
{
    int id, n;
    cin >> id >> n;
    node a1[100005];
    int ans[100005];
    vector<int> mid;

    for (int i = 0; i < n; i++)
    {
        //通过下标找
        //不用记住id了
        int x;
        cin >> x;
        cin >> a1[x].data >> a1[x].next;
    }
    // cout << endl;
    //排序
    while (id != -1)
    {
        mid.push_back(id);
        id = a1[id].next;
    }
    //3 测试点
    n = mid.size();
    //ans出动
    int a = 0, b = n - 1;
    int I = 0;
    //按题目的要求的顺序
    while (a <= b)
    {
        if (a == b)
            //奇数的情况
            ans[I++] = mid[b--];
        else
        {
            ans[I++] = mid[b--];
            ans[I++] = mid[a++];
        }
    }
    for (int i = 0; i < (I - 1); i++)
    {
        printf("%05d %d %05d\n", ans[i], a1[ans[i]].data, ans[i + 1]);
    }
    //最后的单独处理
    printf("%05d %d -1\n", ans[I - 1], a1[ans[I - 1]].data);
    return 0;
}


2.map

#include <iostream>
#include <map>
#include <iomanip>
#include <vector>
#include <utility>
using namespace std;
int main()
{
	int a, n;
	cin >> a >> n;
	//id当索引 data和next当内容
	//把pair当成一个数组
	map<int, pair<int, int>> mp;
	while (n--)
	{
		int s, x, e;
		cin >> s >> x >> e;
		mp[s] = make_pair(x, e);
	}
	vector<pair<int, int>> v;
	//先把正确的顺序搞对
	//往v里加的 id和data
	//next作为下一个的索引
	for (int adr = a; adr != -1; adr = mp[adr].second)
	{
		v.push_back(make_pair(mp[adr].first, adr));
	}
	//根据题目的排序
	int s = 0, r = v.size() - 1;
	while (s < r)
	{
		//第一次不输出
		if (r != v.size() - 1) //2.这个是下一个的id (这个要放到最前面 因为最后要输出-1)
			cout << setw(5) << setfill('0') << v[r].second << "\n";
		//1.当前的id
		cout << setw(5) << setfill('0') << v[r].second << ' ';
		//1.当前的data
		cout << v[r--].first << " ";
		//1.下一个的id
		cout << setw(5) << setfill('0') << v[s].second << "\n";
		//2.当前的id
		cout << setw(5) << setfill('0') << v[s].second << " ";
		//2.当前的data
		cout << v[s++].first << ' ';
	}
	//有可能是奇数
	if (s == r)
	{
		cout << setw(5) << setfill('0') << v[s].second << "\n";
		cout << setw(5) << setfill('0') << v[s].second << " ";
		cout << v[s].first << ' ';
	}
	cout << "-1\n";
	return 0;
}
发布了106 篇原创文章 · 获赞 25 · 访问量 7242

猜你喜欢

转载自blog.csdn.net/weixin_45653525/article/details/104146067