题目链接
思路一:
遍历链表,使用一个map来记录每个节点值出现的次数
再次遍历链表,若当前节点的值只出现了一次,那么就进行保留,否则跳过
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
HashMap<Integer, Integer> map = new HashMap<>();
ListNode cur = head;
while (cur != null) {
// 之前未出现过该值
if (!map.containsKey(cur.val)) {
map.put(cur.val, 1);
} else { // 之前出现过该值
map.put(cur.val, map.get(cur.val) + 1);
}
cur = cur.next;
}
cur = head;
ListNode newHead = null;
ListNode last = null;
while (cur != null) {
// 当前节点值只出现了一次
if (map.get(cur.val) == 1) {
// 设置新链表的头节点
newHead = newHead == null ? cur : newHead;
// 设置新链表的当前尾节点
last = last == null ? newHead : last;
// 当前节点不是头节点时,进行连接
if (newHead != cur) {
last.next = cur;
last = cur;
}
}
cur = cur.next;
}
if (last != null)
last.next = null;
return newHead;
}
class ListNode {
int val;
ListNode next;
ListNode(int x) { val = x; }
}
思路二:
遍历一次链表即可,遇到重复值的节点时,直接跳过,否则拼接
public ListNode deleteDuplicates(ListNode head) {
if (head == null || head.next == null) {
return head;
}
// 新增一个头节点
ListNode dummy = new ListNode(0);
dummy.next = head;
ListNode cur = dummy;
while (cur.next != null && cur.next.next != null) {
// 此节点的值重复出现时
if (cur.next.val == cur.next.next.val) {
ListNode dup = cur.next;
// 寻找此节点后面第一个不重复的节点
while (dup != null && dup.next != null && dup.val == dup.next.val) {
dup = dup.next;
}
// 第一个不重复的节点进行连接
cur.next = dup.next;
} else { // 此节点的值只出现了一次,则直接进行连接
cur = cur.next;
}
}
return dummy.next;
}