L2-002 链表去重 (25 分)
给定一个带整数键值的链表 L,你需要把其中绝对值重复的键值结点删掉。即对每个键值 K,只有第一个绝对值等于 K 的结点被保留。同时,所有被删除的结点须被保存在另一个链表上。例如给定 L 为 21→-15→-15→-7→15,你需要输出去重后的链表 21→-15→-7,还有被删除的链表 -15→15。
输入格式:
输入在第一行给出 L 的第一个结点的地址和一个正整数 N(≤105,为结点总数)。一个结点的地址是非负的 5 位整数,空地址 NULL 用 −1 来表示。
随后 N 行,每行按以下格式描述一个结点:
地址 键值 下一个结点
其中地址是该结点的地址,键值是绝对值不超过104的整数,下一个结点是下个结点的地址。
输出格式:
首先输出去重后的链表,然后输出被删除的链表。每个结点占一行,按输入的格式输出。
输入样例:
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
这题奇怪在网上竟然找不到java实现的,然后就自己写了一段代码,但是第三个测试点错误,第四第五个测试点超时,不过java写这种题目超时也不是很奇怪,可能是因为超时的原因找不到java实现的代码吧。
代码实现:
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String[] s = in.readLine().split(" ");
int head = Integer.parseInt(s[0]);
int n = Integer.parseInt(s[1]);
// 判断是否重复的标记
boolean[] flag = new boolean[10000];
// 用map集合存储所有的数据
Map<Integer, int[]> map = new HashMap<Integer, int[]>();
for (int i = 0; i < n; i++) {
String[] str = in.readLine().split(" ");
int a1 = Integer.parseInt(str[0]);
int a2 = Integer.parseInt(str[1]);
int a3 = Integer.parseInt(str[2]);
int[] arr = { a2, a3 };
map.put(a1, arr);
}
// 定义一个存储未重复的结点的数组
List<Integer> list1 = new ArrayList<Integer>();
// 定义一个存储重复的结点的数组
List<Integer> list2 = new ArrayList<Integer>();
for (int i = head; i != -1; i = map.get(i)[1]) {
int[] arr = map.get(i);
if (!flag[Math.abs(arr[0])]) {
flag[Math.abs(arr[0])] = true;
list1.add(i);
} else {
list2.add(i);
}
}
// 输出不重复的链表
if (list1.size() > 0) {
for (int i = 0; i < list1.size(); i++) {
System.out.printf("%05d ", list1.get(i));
System.out.print(map.get(list1.get(i))[0] + " ");
if (i == list1.size() - 1) {
System.out.println(-1);
} else {
int temp = i + 1;
System.out.printf("%05d\n", list1.get(temp));
}
}
}
// 输出重复链表
if (list2.size() > 0) {
for (int i = 0; i < list2.size(); i++) {
System.out.printf("%05d ", list2.get(i));
System.out.print(map.get(list2.get(i))[0] + " ");
if (i == list2.size() - 1) {
System.out.println(-1);
} else {
int temp = i + 1;
System.out.printf("%05d\n", list2.get(temp));
}
}
}
}
}