PAT 天梯赛 L2-022. 重排链表 【数据结构】

题目链接

https://www.patest.cn/contests/gplt/L2-022

思路

先用结构体 把每个结点信息保存下来
然后深搜一下 遍历一下整个链表

然后就重新排一下

但是要注意一个坑点 是
有效的结点数 不一定是n 这个原因 导致第三个测试点过不了
意思就是 它给出N 个结点 但是不一定这N个结点 都是在一张链表上的
也就是说 我们需要仅仅是 头结点在的那张链表

因为 它仅仅需要输出 所以 下一个地址 直接输出下一个地址的地址就可以了

而不用 所以操作 重新指向一遍

查了好久。。

AC代码

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#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  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  ans, vis;

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);
}

你可能感兴趣的:(PAT,天梯赛)