思路
比较暴力的做法。。没有双指针的做法好。
利用map存储链表所有的节点,然后在遍历Remove map中的每一个节点的过程中判断删除后map是否还包含该节点值,如果删除后还包含,则把该节点加上,相当于undoRemove操作;如果删除后map中不包含该节点值,则保留该节点值,最后依据之前保留的节点值重构链表。
代码

public ListNode deleteDuplicates (ListNode head) {
    // write code here
    if (head==null){
        return head;
    }else {
        HashMap<Integer,Integer> map = new HashMap<>();
        ListNode node = head;
        ListNode tail = new ListNode(0);
        ListNode result=tail;
        int i=0;
        while (node!=null){
            map.put(i++,node.val);
            node=node.next;
        }
        ArrayList<Integer> list = new ArrayList<>();
        int size= map.size();
        for (int j=0;j<size;j++){
            int value = map.get(j);
            map.remove(j);                 //将当前位置的map值删了
            if (map.containsValue(value)){ //如果删除后map中还有值,则取消删除操作
                map.put(i,value);
            }else {
                list.add(value);           //否则证明该值只在map中出现一次
            }
        }
        if (!list.isEmpty()){
            for (int j=0;j<list.size();j++){
                ListNode listNode = new ListNode(list.get(j));
                tail.next=listNode;
                tail=tail.next;
            }
        }
        return result.next;
    }
}