7-11 链表去重 (25 分)


 

 首先用一个结构体存放原始的键值和下标。

然后遍历该结构体数组,如果当前遍历的节点的键值的绝对值没有在前面出现过,那么就再开一个数组用来存该节点的编号,并且标记为出现过,防止后续再次存他的下标。否则如果出现过,那么就再开一个数组存之前出现过的节点的下标。然后将头节点往后移,h = next[h] 如此重复。

#include 
using namespace std;
#define forn(i,n) for(int i = 0; i < n; i++)
const int N = 1e6+10;
struct Node {
    int key;
    int nextnode;
}node;
bool st[N];
node q[N], a[N], b[N];
int h, n, leng1, leng2;

int main() {
    cin >> h >> n;
    forn(i,n) {
        int id;
        cin >> id;
        cin >> q[id].key >> q[id].nextnode;
    }
    while(h!=-1) {
        if(st[abs(q[h].key)]) {
            b[leng2++] = h;
            b[leng2] = -1;
            h = q[h].nextnode;
        } else {
            st[abs(q[h].key)] = 1;
            a[leng1++] = h;
            a[leng1] = -1;
            h = q[h].nextnode;
        }
    }
    for(int i = 0; i < leng1; i++) {
        if(a[i].nextnode != -1) {
            printf("%05d %d %05d\n", a[i], q[a[i]].key, q[a[i]].nextnode);
        } else {
            printf("%05d %d %d\n", a[i], q[a[i]].key, q[a[i]].nextnode);
        }
    }
    for(int i = 0; i < leng2; i++) {
        if(b[i].nextnode != -1) {
            printf("%05d %d %05d\n", b[i], q[b[i]].key, q[b[i]].nextnode);
        } else {
            printf("%05d %d %d\n", b[i], q[b[i]].key, q[b[i]].nextnode);
        }
    }
    return 0;
}