<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
问题是什么?我清楚地将所有节点插入到一个哈希集中并检查它是否包含但不确定发生了什么?
答案 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
类中实现hashCode
和ListNode
,如果节点具有相同的val
,则可以认为节点相等:
int hashCode() { return val; }
boolean equals(Object other) {
if (other == this) return true;
return (other instanceof ListNode)
&& val == ((ListNode) other).val;
}