7-11 链表去重 (25 分)
首先用一个结构体存放原始的键值和下标。
然后遍历该结构体数组,如果当前遍历的节点的键值的绝对值没有在前面出现过,那么就再开一个数组用来存该节点的编号,并且标记为出现过,防止后续再次存他的下标。否则如果出现过,那么就再开一个数组存之前出现过的节点的下标。然后将头节点往后移,h = next[h] 如此重复。
#includeusing 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; }