参考上一篇hashmap设计思路hashmap设计,这里去除值的属性,采用数组+链表的模式实现hashSet的实现
public class MyHashSet {
final ListNode[] nodes;
public MyHashSet() {
this.nodes = new ListNode[124981];
}
public void add(int key) {
int index = idx(key);
if (nodes[index] == null) {
nodes[index] = new ListNode(key);
} else {
ListNode node = nodes[index];
ListNode pre = null;
while (node != null && node.key != key) {
pre = node;
node = node.next;
}
if (node == null) {
pre.next = new ListNode(key);
}
}
}
private int idx(int key) {
return Integer.hashCode(key) % nodes.length;
}
public void remove(int key) {
int index = idx(key);
if (nodes[index] != null) {
ListNode node = nodes[index];
ListNode pre = null;
while (node != null && node.key != key) {
pre = node;
node = node.next;
}
if (node != null ) {
if(pre != null)
pre.next = node.next;
else nodes[index] = null;
}
}
}
public boolean contains(int key) {
int index = idx(key);
if (nodes[index] == null) {
return false;
} else {
ListNode node = nodes[index];
while (node != null && node.key != key) {
node = node.next;
}
return node != null;
}
}
class ListNode {
int key;
ListNode next;
public ListNode(int key) {
this.key = key;
}
}
}