程序员代码面试指南第二版 24.删除无序链表中值重复出现的节点
题目描述
给定一个无序链表,删除其中值重复出现的节点(保留当中顺序遍历第一个出现的节点)。
输入描述:
第一行一个整数 n,表示单链表的节点数量。
第二行 n 个整数表示单链表的节点的值。
输出描述:
顺序输出单链表每个节点的值。
示例1
输入
5
1 3 2 3 1
输出
1 3 2
第一次做; 使用选择排序的思想, 拿时间换空间; 时间复杂度O(n^2), 空间复杂度O(1); 注意外层循环中left指针的更新; 牛客网暂时通不过这种方法
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
if(n < 1)
return;
String[] str = sc.nextLine().split(" ");
ListNode head = new ListNode(Integer.parseInt(str[0]));
ListNode curr = head;
for(int i=1; i<n; i++){
curr.next = new ListNode(Integer.parseInt(str[i]));
curr = curr.next;
}
curr = head;
ListNode left = head, right;
while(curr!=null){
right = curr.next;
while(right!=null){
if(right.val==curr.val){
left.next = right.next;
right = right.next;
}
else{
left = left.next;
right = right.next;
}
}
left = curr.next;
curr = curr.next;
}
curr = head;
while(curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
}
public static class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
}
第一次做; 使用哈希表; 时间复杂度O(n), 空间复杂度O(n)
import java.util.Scanner;
import java.util.Set;
import java.util.HashSet;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
int n = Integer.parseInt(sc.nextLine());
if(n < 1)
return;
String[] str = sc.nextLine().split(" ");
ListNode head = new ListNode(Integer.parseInt(str[0]));
ListNode curr = head;
for(int i=1; i<n; i++){
curr.next = new ListNode(Integer.parseInt(str[i]));
curr = curr.next;
}
Set<Integer> set = new HashSet<>();
ListNode left = head;
set.add(head.val);
curr = head.next;
while(curr!=null){
if(set.contains(curr.val)){
left.next = curr.next;
curr = curr.next;
}
else{
set.add(curr.val);
left = curr;
curr = curr.next;
}
}
curr = head;
while(curr!=null){
System.out.print(curr.val+" ");
curr = curr.next;
}
}
public static class ListNode{
int val;
ListNode next;
ListNode(int val){
this.val = val;
}
}
}