PAT A1097 Deduplication on a Linked List

思路:遍历给出的静态链表,通过设置标记数组记录每个键值是否已经出现过。

每个结点赋予一个order排序值,初始时所有结点的order初始化为2*maxn,未出现过的键值结点赋值valid从0开始,最终值为有效结点的数量。

出现过要被删除的结点键值按照removed + maxn进行赋值,removed从0开始,最终值为被删除的结点数量。调用sort按照order进行排序。

#include<cstdio>
#include<algorithm>
using namespace std;

const int maxn = 100005;
const int table_size = 10005;
typedef struct {
    int addr, key, next, order;
} Node;

Node node[maxn];
bool keyExist[table_size];

int abs(int x) {
    if(x > 0) return x;
    return -x;
}

bool cmp(Node a, Node b) {
    return a.order < b.order;
}

int main() {
    int s1, n;
    scanf("%d %d", &s1, &n);
    int addr, key, next;
    for(int i = 0; i < n; i++) {
        scanf("%d %d %d", &addr, &key, &next);
        node[addr].addr = addr;
        node[addr].key = key;
        node[addr].next = next;
    }
    for(int i = 0; i < maxn; i++)
        node[i].order = 2 * maxn;
    int valid = 0, removed = 0, p = s1, data;
    while(p != -1) {
        data = abs(node[p].key);
        if(!keyExist[data]) {
            keyExist[data] = true;
            node[p].order = valid++;
        } else {
            node[p].order = maxn + removed++;
        }
        p = node[p].next;
    }
    sort(node, node + maxn, cmp);
    int total = valid + removed;
    for(int i = 0; i < total; i++) {
        if(i != valid - 1 && i != total - 1) 
            printf("%05d %d %05d\n", node[i].addr, node[i].key, node[i + 1].addr);   
        else 
            printf("%05d %d -1\n", node[i].addr, node[i].key);
    }
    return 0;
}