题意:
链表的题,将重叠的去掉,组成两个链表。
解答:
PAT的链表题都是一个套路,定义节点Node,并把id和Node对象放到map中,方便寻找。
这里为了方便查找有没有重复,使用了HashSet,因为Hashset有contains方法可以方便检查是否重复。
1、首先要遍历所有的节点,防止会有无用节点
2、节点的next需要重写
3、尾节点一定要定位-1;
具体的java代码实现:
import java.util.Scanner;
import java.util.HashMap;
import java.util.ArrayList;
import java.util.HashSet;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String head = sc.next();
int n = sc.nextInt();
HashMap<String,Node> map = new HashMap<>();
for(int i =0;i<n;i++){
String tmpAds = sc.next();
Node tmpNode = new Node();
tmpNode.ads=tmpAds;
tmpNode.key=sc.nextInt();
tmpNode.next=sc.next();
map.put(tmpAds,tmpNode);
}
sc.close();
ArrayList<Node> list = new ArrayList<Node>();
ArrayList<Node> reList = new ArrayList<Node>();
HashSet<Integer> set = new HashSet<>();
while(!head.equals("-1")){
Node tmp = map.get(head);
int val = Math.abs(tmp.key);
if(!set.contains(val)){
list.add(tmp);
set.add(val);
}
else{
reList.add(tmp);
}
head = map.get(head).next;
}
for(int i=0;i<list.size()-1;i++){
list.get(i).next = list.get(i+1).ads;
}
if(!list.isEmpty())
list.get(list.size()-1).next="-1";
for(int i=0;i<reList.size()-1;i++){
reList.get(i).next = reList.get(i+1).ads;
}
if(!reList.isEmpty())
reList.get(reList.size()-1).next = "-1";
printList(list);
printList(reList);
}
private static void printList(ArrayList<Node> list){
for (Node tmp : list) {
System.out.println(tmp.ads + " " + tmp.key + " " + tmp.next);
}
}
private static class Node{
String ads;
int key;
String next;
}
}