7-1 链表去重 (25 分)
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤100000 ,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 -1 来表示。
随后 N 行,每行按以下格式描述一个结点:
地址 键值 下一个结点
其中地址是该结点的地址,键值是绝对值不超过10000 的整数,下一个结点是下个结点的地址。
输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。
输入样例:
00100 5 99999 -7 87654 23854 -15 00000 87654 15 -1 00000 -15 99999 00100 21 23854
输出样例:
00100 21 23854 23854 -15 99999 99999 -7 -1 00000 -15 87654 87654 15 -1
我的代码:
#include<stdio.h> struct Node { int address; int data; int next; }; struct Node A[100000]; int main() { int data[10000] = { 0 }; int head, N; scanf("%d %d", &head, &N); int i; int address, dat, next; for (i = 0; i < N; i++) { scanf("%d %d %d", &address, &dat, &next); A[address].address = address; A[address].data = dat; A[address].next = next; } int cur = head; int tmp = A[cur].next; int head2,cur2; int flag = 1; data[A[cur].data] = 1; while (A[tmp].address != -1) { if (data[A[tmp].data] == 0) { data[A[tmp].data] = 1; tmp = A[tmp].next; cur = A[cur].next; } else if (data[A[tmp].data] == 1) { A[cur].next = A[tmp].next; if (flag) { head2 = tmp; cur2 = head2; flag = 0; } else { A[cur2].next = tmp; cur2 = A[cur2].next; } tmp = A[cur].next; } } cur = head; cur2 = head2; while (A[cur].next != -1) { printf("%d ", A[cur].data); cur = A[cur].next; } printf("\n"); while (A[cur2].next != -1) { printf("%d ", A[cur2].data); cur2 = A[cur2].next; } }