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