1. 删除链表中的重复元素
我们可以使用两种方法去解决:
① 一种是利用哈希表(HashSet),哈希表特别适合于判断集合中是否有重复的元素
② 第二种方法是直接使用遍历链表,使用两层for循环去遍历再来找出重复的元素,下面使用哈希表来寻找重复的元素
2. 首先我们要解决几个问题
① 如何利用数组来生成一个链表,这里我们可以构建一个哑元(空的节点)来进行数组中每个元素作为节点的生成
② 有了链表之后我们如何判断是否有重复元素的问题
首先我们先新建一个哈希表,哈希表其实就是HashSet,然后遍历生成的链表,其中使用到了两个指针,一个指向当前的元素,一个指向前一个元素,使用两个指针的目的是为了在发现有重复的元素之后我们可以直接改变指针的指向,即可以将前一个指针的next直接指向下一个元素,那么重复的元素相当于就删除了,在遍历的过程中发现哈希表没有当前元素即把当前元素加进到哈希表中,指针往下移动,发现哈希表中已经存在当前的元素,直接改变前一个指针的指向,指向当前的指针继续往下移动等到遍历完链表之后那么链表中的元素就没有重复了
其中比较关键的操作是怎么样使用链表来删除元素和怎么样使用哈希表来判断是否有重复的元素
3. 相关的代码如下:
public class Main{
//内部的私有类
private static class ListNode{
ListNode next;
Object value;
public ListNode(Object value) {
super();
this.value = value;
}
}
public static void main(String[] args) {
int arr[] = {1, 2, 3, 5, 4, 2, 3, 1, 7, 9, 10};
//利用数组生成链表
ListNode head = new ListNode(null);
ListNode p = head;
for(int i = 0; i < arr.length; i++){
p.next = new ListNode(arr[i]);
p = p.next;
}
removeRepetition(head);
ListNode p1 = head.next;
while(p1 != null){
System.out.print(p1.value + " ");
p1 = p1.next;
}
}
private static void removeRepetition(ListNode head){
//for循环的第一个指针
ListNode first = head.next;
//for循环的第二个指针
ListNode second = null;
ListNode p = null;
ListNode pre = null;
while(first != null){
pre = first;
second = first.next;
p = first;
while(second != null){
if(pre.value == second.value){
p.next = second.next;
}else{
//注意这句代码不能够写到else外面
p = second;
}
second = second.next;
}
first = first.next;
}
}
}