【Algorithm】GPLT L2-022 重排链表

L2-022 重排链表

Problem

Solution

最初的想法:初始链表,12345…n,重排后 n1(n-1)2(n-2)3…,不能够局限于链表重排的实现,链表是及其麻烦的,我们用结构体模拟链表。开了一个结构数组进行输入,下标是地址,还包括数据域,和下一个地址。在开另外两个结构数组,来记录123 … n/2 和 n(n-1)(n-2) … ceil(n/2.0),其中,记录第二个结构数组时,采用倒叙记录,方便和第一个下边保持一致。

结果:测试点 3 没过,查阅资料才知道,是输入的时候有许多多余的数据进入了表中,我们一直反复在用 n,但是我们应该用 n 有效值,循坏遍历,算出有效值 n。

Code

#include <bits/stdc++.h>
using namespace std;

struct node {
    int data;
    int next;
} a[100010], s[100010];
struct f {
    int data;
    int address;
} b[50010], c[50010];

int main()
{
    int head, n;
    cin >> head >> n;
    for(int i = 1; i <= n; i++) {
        int x, y, z;
        cin >> x >> y >> z;
        s[x].data = y;
        s[x].next = z;
    }
    
    int q = head;
    n = 0;
    while(q != -1) {
        n++;
        a[q].data = s[q].data;
        a[q].next = s[q].next;
        q = a[q].next;
    }

    int p, cnt = 1, bk = 0, ck = ceil(n / 2.0);
    for(p = head, bk = 1; bk <= n / 2; bk++, p = a[p].next) {
        b[bk].data = a[p].data;
        b[bk].address = p;
    }
//    cout << a[p].data << "\n";
    for(ck = ceil(n / 2.0); p != -1;ck--, p = a[p].next) {
        c[ck].data = a[p].data;
        c[ck].address = p;
    }

//     for(int i = 1; i <= n / 2; i++)
//         cout << b[i].data << " ";
//     cout << "\n";
//     cout << ck << " " << ceil(n / 2.0) << "\n";
//     for(int i = 1; i <= ceil(n / 2.0); i++)
//         cout << c[i].data << " ";
//     cout << "\n";
    
    for(int i = 1; i <= ceil(n / 2.0); i++) {
        //cout << c[i].address << " " << c[i].data << " ";
        printf("%05d %d ", c[i].address, c[i].data);
        if(i < bk) //cout << b[i].address << "\n" << b[i].address << " " << b[i].data << " ";
            printf("%05d\n%05d %d ", b[i].address, b[i].address, b[i].data);
        if(i == ceil(n / 2.0)) cout << "-1\n";
        else //cout << c[i + 1].address << "\n";
            printf("%05d\n", c[i + 1].address);
    }
    
}

根据柳婼的代码,修改了一下。“l, r代表将要输出的节点位置,当(l-1)-(r+1) == 1时都遍历一遍了,可退出循环。” 确实难理解,QwQ!分奇偶,多画画。

#include <iostream>
#include <vector>
using namespace std;
struct node{
    int id, data, next;
};
int main() {
    int begin, n;
    cin >> begin >> n;
    node a[100010];
    vector<node> v, ans;
    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(l <= r) {
        ans.push_back(v[r]);
        r--;
        if(r < l) break;
        //if((r + 1) - (l - 1) == 1) break;
        ans.push_back(v[l]);
        l++;
        if(r < l) break;
        //if((r + 1) - (l - 1) == 1) break;
    }
//    cout << r << " " << l << "\n";
    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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值