解法1:遍历然后删除所有的

用一个临时变量conpared来存储当前需要比较的值

如果发现这个值是重复的,那么就用while循环找到最后一个重复的节点,直接删除这一堆重复的点prev.next = current.next;

如果没有发现重复的,那就prev继续往下去遍历

每一轮结束都要重新让current指向prev的下一个节点

import java.util.*;

public class Solution {
    public ListNode deleteDuplicates (ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode prevOfHead = new ListNode(-1001);
        ListNode prev = prevOfHead;
        prev.next = head;
        ListNode current = head;
        int comparedValue;
        while (current != null && current.next != null) {
            comparedValue = current.val;
            if (current.next.val == comparedValue) {
                // find the last duplicated node 
                while (current.next != null && current.next.val == comparedValue) {
                    current = current.next;
                }
            // delete all duplicated node by link prev with next of last duplicated node
                prev.next = current.next;
            } else {
                prev = prev.next;
            }
            
            if (prev != null) {
                current = prev.next;
            }
        }
        return prevOfHead.next;
    }
}

解法2:递归

import java.util.*;
public class Solution {
    public ListNode deleteDuplicates (ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }
        ListNode prevOfHead = new ListNode(-1001);
        prevOfHead.next = head;
        int comparedValue = head.val;
	  // if head is duplicate node, then move head to the next node with diff value
        if (head.val == head.next.val) {
            while (head != null && head.val == comparedValue) {
                head = head.next;
            }
            prevOfHead.next = deleteDuplicates(head);
        } else {
		  //if node is not duplicate node, then just handle next node
            head.next = deleteDuplicates(head.next);
        }
        return prevOfHead.next;
    }
}

解法3:哈希表

import java.util.*;
public class Solution {
    public ListNode deleteDuplicates (ListNode head) {
        if (head == null || head.next == null) {
            return head;
        }

        Set<Integer> visited = new HashSet<Integer>();
        ListNode prevOfHead = new ListNode(-1001);
        prevOfHead.next = head;
        ListNode current = head;
        ListNode prev = prevOfHead;
        while (current != null) {
            visited.add(current.val);
		  // if current is duplicated node, then move current util the val is different;
            if (current.next != null && visited.contains(current.next.val)) {
                while(current.next != null && visited.contains(current.next.val)) {
                    current = current.next;
                }
                prev.next = current.next;
                current = prev.next;
            } else {
                prev = current;
                current = current.next;
            }
        }
        return prevOfHead.next;
    }
}

时间复杂度:O(n)

空间复杂度:O(n)

个人感觉没有必要用哈希来做,因为这个链表是顺序存储的,因为用一个临时变量就够了

甚至不需要临时变量,一直用current.val == current.next.val 来判断就可以了