为什么我不能从链表中删除重复项?

时间:2017-04-21 09:34:02

标签: java database algorithm

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    ...
    <item name="actionOverflowButtonStyle">@style/MyOverflowButtonStyle</item>
</style>

<style name="MyOverflowButtonStyle" parent="Widget.AppCompat.ActionButton.Overflow">
    <item name="android:tint">#62ff00</item>
</style>

我应该从未排序的列表中删除重复项,但它不能用于Java。

/* DEFINITIONS public class ListNode { int val; ListNode next; public ListNode(int x){ val = x; next = null; } } public class LinkedList { ListNode head; } */ public void removeDups(){ ListNode head = this.head; if(head == null) return; HashSet<ListNode> set = new HashSet<>(); set.add(head); while(head.next != null){ if(set.contains(head.next)){ head.next = head.next.next; } else{ set.add(head.next); head = head.next; } } } 应返回1->2->4->9->9->4,但仍会返回1->2->4->9

问题是什么?我清楚地将所有节点插入到一个哈希集中并检查它是否包含但不确定发生了什么?

3 个答案:

答案 0 :(得分:6)

您正在删除重复的节点,而不是您发布的代码中的重复节点。

 /*
DEFINITIONS

public class ListNode {
    int val;
    ListNode next;
    public ListNode(int x){
        val = x;
        next = null;
    }

}


public class LinkedList {
    ListNode head;
}
*/


public void removeDups(){
    ListNode head = this.head;
    if(head == null) return;

    HashSet<Integer> set = new HashSet<Integer>();
    set.add(head.val);
    while(head.next != null){
        if(set.contains(head.next.val)){
            head.next = head.next.next;
        } else{
            set.add(head.next.val);
            head = head.next;
        }
    }
}

答案 1 :(得分:1)

您正在尝试检查set是否包含ListNode,但您没有覆盖equals课程中的ListNode方法。尝试重写它,或者添加值来设置,而不是整个节点,它将起作用,因为值是简单的整数。

您还应该覆盖hashCode方法,因为在覆盖equals时应始终这样做 - 感谢Andy Turner

答案 2 :(得分:1)

只需添加到v78's answer,即可正确描述其目前无效的原因:

或者,您可以在equals类中实现hashCodeListNode,如果节点具有相同的val,则可以认为节点相等:

int hashCode() { return val; }

boolean equals(Object other) {
  if (other == this) return true;
  return (other instanceof ListNode)
      && val == ((ListNode) other).val;
}