pat L2-002 链表去重

题目大意:对一个链表进行去重操作,如果一个数字的绝对值已经出现过了,就取出这个节点,组成一个新的链表。

分析:直接模拟就好了。刚开始的时候对五位数是用string进行处理的,然后tle,然后还有dfs1e5次导致re。好迷啊这个题,写了一个多小时。有毒!!!

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
struct node{
    int data;
    int next;
    int pos;
}a[maxn];
map<int,bool> vis;
node rem[maxn],del[maxn];
int rem_num,del_num;
void dfs(int pos) {
    rem_num = del_num = 0;
    while (pos != -1) {
        if (vis[abs(a[pos].data)])
            del[del_num].data = a[pos].data, del[del_num].next = -1, del[del_num].pos = pos, del_num++;
        else
            rem[rem_num].data = a[pos].data, rem[rem_num].next = -1, rem[rem_num].pos = pos, rem_num++;
        vis[abs(a[pos].data)] = true;
        pos = a[pos].next;
    }
}
int main() {
    int n, start, now, nex, x;
    cin >> start >> n;
    for (int i = 0; i < n; i++) {
        cin >> now >> x >> nex;
        a[now].next = nex;
        a[now].data = x;
    }
    dfs(start);
    if (rem_num) {
        for (int i = 0; i < rem_num - 1; i++)
            printf("%05d %d %05d\n", rem[i].pos, rem[i].data, rem[i + 1].pos);
        printf("%05d %d %d\n", rem[rem_num-1].pos, rem[rem_num-1].data, -1);
    }
    if (del_num) {
        for (int i = 0; i < del_num - 1; i++)
            printf("%05d %d %05d\n", del[i].pos, del[i].data, del[i + 1].pos);
        printf("%05d %d %d\n", del[del_num-1].pos, del[del_num-1].data, -1);
    }
    return 0;
}

猜你喜欢

转载自www.cnblogs.com/SwiftAC/p/12180870.html