题目描述
给定一个无序链表,删除其中值重复出现的节点(保留当中顺序遍历第一个出现的节点)。
输入描述:
第一行一个整数 n,表示单链表的节点数量。
第二行 n 个整数表示单链表的节点的值。
输出描述:
顺序输出单链表每个节点的值。
示例1
输入
5
1 3 2 3 1
输出
1 3 2
解法一:用set保存所有的数
思路: 最开始用的列表,会超时,因为列表在寻找元素的时候太费时间
import java.io.*;
import java.util.*;
public class Main{
public static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
public static ListNode create(int len,String[] ss){
ListNode head = new ListNode(0);
ListNode r = head;
for(int i=0;i<len;i++){
ListNode node = new ListNode(Integer.parseInt(ss[i]));
r.next = node;
r = node;
}
return head.next;
}
public static ListNode delCommon(ListNode head){
if(head==null||head.next==null) return head;
HashSet<Integer> set = new HashSet<>();
ListNode pre = head;
set.add(head.val);
ListNode tmp = head.next;
while(tmp!=null){
if(set.contains(tmp.val)){
pre.next = tmp.next;
}else{
pre = tmp;
set.add(tmp.val);
}
tmp = tmp.next;
}
return head;
}
public static void main(String[] args) throws IOException{
int len = Integer.parseInt(br.readLine());
String[] ss = br.readLine().trim().split(" ");
ListNode head = create(len,ss);
head = delCommon(head);
StringBuilder sb = new StringBuilder();
while(head!=null){
sb.append(head.val).append(" ");
head = head.next;
}
System.out.println(sb.toString());
}
}
class ListNode{
int val;
ListNode next;
public ListNode(int val){
this.val = val;
this.next = null;
}
}