题目描述
在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5
思路
- 我们可以利用HashSet的不可重复特性,将重复的元素进行存储,再将所有出现过的元素存到另一个集合中
- 创建两个链表引用,一个用来删除结点(跳过重复结点),一个用来进行元素重复判断
- 跳过重复的,最终整合成一个结果链表即可
难点
书写代码时应该先判断输入条件:
- 当输入为空或者为单个元素时,直接返回该值即可
- 判断除了第一种情况,可能出现的链表结构,重复与未重复的混合结构。
代码
import java.util.HashSet;
/*
public class ListNode {
int val;
ListNode next = null;
ListNode(int val) {
this.val = val;
}
}
*/
public class Solution {
private HashSet<Integer> setAll = new HashSet<>();
private HashSet<Integer> set = new HashSet<>();
public ListNode deleteDuplication(ListNode pHead){
if(pHead == null || pHead.next ==null){
return pHead;
}
ListNode post = pHead;
ListNode head = pHead;
while(head != null){
if(setAll.contains(head.val)){
set.add(head.val);
}
setAll.add(head.val);
head = head.next;
}
head = pHead;
while(head != null && set.contains(head.val)){
head = head.next;
}
pHead = head;
post = head;
while(head != null){
head = head.next;
while(head != null && set.contains(head.val)){
head = head.next;
}
post.next = head;
post = post.next;
}
return pHead;
}
}