代码

我觉得哈希表主要是散列函数的应用以及链表的综合使用。而散列函数是我们规定的

public class Main {
public static void main(String[] args) {
Employer zhangsan = new Employer(1,"张三");
Employer lisi = new Employer(7,"李四");
Employer wangwu = new Employer(5,"王五");
Employer zhaoliu = new Employer(9,"赵六");

HashTable hashTable = new HashTable(10);
hashTable.add(zhangsan);
hashTable.add(lisi);
hashTable.add(wangwu);
hashTable.add(zhaoliu);

hashTable.list();

System.out.println(hashTable.findEmployer(5));
System.out.println(hashTable.findEmployer(6));

hashTable.delete(9);
hashTable.list();
}
}
//哈希表
class HashTable{
//保存 管理链表的类 的数组
EmployerLinkedList[] employerLinkedListArray;
//哈希表的链表条数
int size;

public HashTable(int size) {
this.size = size;
employerLinkedListArray = new EmployerLinkedList[size];//这里只是把数组创建了,每个元素还是null
//也就是说每个元素都不是EmployerLinkedList类型的

//初始化每条链表
for (int i = 0;i < size;i++){
employerLinkedListArray[i] = new EmployerLinkedList();
}
}

//增加员工
public void add(Employer employer){
//先判断把他加到第几个链表
employerLinkedListArray[hashFun(employer.id)].add(employer);
}

//遍历所有的员工
public void list(){
for (int i = 0;i < size;i++){
if (employerLinkedListArray[i].head == null){
System.out.println("第"+i+"号链表为空");
}else {
employerLinkedListArray[i].list();
}
}
}

//查找员工信息
public Employer findEmployer(int id){
//先找到该员工在几号链表
return employerLinkedListArray[hashFun(id)].find(id);
}

//删除某员工
public void delete(int id){
employerLinkedListArray[hashFun(id)].delete(id);
}
//散列函数
public int hashFun(int id){
return id % size;
}
}
//管理链表的类
class EmployerLinkedList{
Employer head;

void add(Employer employer){
//如果链表为空,则加到第一个
if (head == null){
head = employer;
return;
}

//如果不为空,则设置一个辅助指针
Employer temp = head;
while (temp.next != null){
temp = temp.next;
}
//temp指向最后一个节点
temp.next = employer;
}

//遍历
void list(){
//如果链表为空,则退出
if (head == null){
System.out.println("链表为空 无法遍历");
return;
}

Employer temp = head;
while (temp != null){
System.out.println(temp);
temp = temp.next;
}
}

//查找
Employer find(int id){
//如果链表为空,则退出
if (head == null){
System.out.println("链表为空 无法查找");
return null;
}

Employer temp = head;
while (temp != null){
if (temp.id == id){
//找到了
break;
}
temp = temp.next;
}

if (temp == null){
System.out.println("遍历完了都没找到");
return null;
}else {
return temp;
}
}

//删除
void delete(int id){
if (head == null){
System.out.println("该链表为空 无法删除");
return;
}

Employer pre = null;
Employer cur = head;

while (true){
if (cur == null){
System.out.println("遍历完了也没找到 删除不了");
break;
}

if (cur == head){
//证明是第一次比较
if (head.id == id){
//找到了 删除的就是第一个
head = head.next;
break;//找到了别忘了break
}else {
//没找到 则往后推
pre = head;
cur = head.next;
}
}else {
//证明不是第一次比较
if (cur.id == id){
//找到了 待删除的就是cur
pre.next = cur.next;
break;//找到了别忘了break
}else {
//没找到 则往后推
pre = cur;
cur = cur.next;
}
}
}
}
}
//每一个员工
class Employer{
int id;
String name;
Employer next;

public Employer(int id, String name) {
this.id = id;
this.name = name;
}

@Override
public String toString() {
return "Employer{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}

结果

第0号链表为空
Employer{id=1, name='张三'}
第2号链表为空
第3号链表为空
第4号链表为空
Employer{id=5, name='王五'}
第6号链表为空
Employer{id=7, name='李四'}
第8号链表为空
Employer{id=9, name='赵六'}
Employer{id=5, name='王五'}
链表为空 无法查找
null
第0号链表为空
Employer{id=1, name='张三'}
第2号链表为空
第3号链表为空
第4号链表为空
Employer{id=5, name='王五'}
第6号链表为空
Employer{id=7, name='李四'}
第8号链表为空
第9号链表为空