思路
比较暴力的做法。。没有双指针的做法好。
利用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; } }