哈希表:数组+链表实现的数据结构。简单实用单向链表来模拟实现
JAVA代码实现:
// 自定义结点
class Node {
// 模拟存放的数据
int id;
String name;
// 指向下一个结点
Node next;
public Node(int id, String name) {
super();
this.id = id;
this.name = name;
}
}
// 创建一个链表
class LinkedList {
// 头结点
private Node head;
// 添加结点
public void add(Node emp) {
if (head == null) {
head = emp;
return;
}
Node curEmp = head;
// 找到next为null的结点
while(curEmp.next != null) {
curEmp = curEmp.next;
}
curEmp.next = emp;
}
// 遍历
public void list() {
if (head == null) {
System.out.println("链表为null");
return;
}
Node curEmp = head;
// 遍历结点
while (curEmp != null) {
System.out.printf("=>id=%d name=%s\t",curEmp.id,curEmp.name);
curEmp = curEmp.next;
}
System.out.println();
}
// 根据id查找结点
public Node findEmpById(int id) {
if (head == null) {
return null;
}
Node curEmp = head;
while (true) {
if (curEmp.id == id) {
return curEmp;
}
if (curEmp.next == null) {
return null;
}
curEmp = curEmp.next;
}
}
// 根据id删除
public void delEmpByid(int id) {
if (head == null) {
System.out.println("没有该结点");
return;
}
Node curEmp = head;
if (head.id == id) {
head = head.next;
return;
}
while(true) {
if (curEmp.next != null && curEmp.next.id == id) {
curEmp.next = curEmp.next.next;
return;
}
if (curEmp.next == null) {
System.out.println("没有该结点");
return;
}
curEmp = curEmp.next;
}
}
}
// 创建hash表
class HashTable {
// 链表数组
private LinkedList[] empLinkedlistArray;
// 数组大小
private int size;
// 初始化
public HashTable(int size) {
this.size = size;
empLinkedlistArray = new LinkedList[size];
}
// 散列函数
public int hashFun(int id) {
return id % size;
}
// 添加的方法
public void add(Node node) {
// 根据id计算出数组index
int index = hashFun(node.id);
// 为null新建一个链表存进去
if (empLinkedlistArray[index] == null) {
empLinkedlistArray[index] = new LinkedList();
}
// 调用添加方法加入新节点
empLinkedlistArray[index].add(node);
}
// 遍历
public void list() {
for (int i = 0; i < size; i++) {
// 为null跳过这次循环
if (empLinkedlistArray[i] == null) {
continue;
}
empLinkedlistArray[i].list();
}
}
// 根据id查找
public void findNodeById(int id) {
// 通过散列函数得到下标
int index = hashFun(id);
if (empLinkedlistArray[index] == null) {
System.out.println("没有找到");
return;
}
// 通过结点的方法找到结点
Node node = empLinkedlistArray[index].findNodeById(id);
if (node == null) {
System.out.println("没有找到");
return;
}
System.out.println(node.name);
}
// 删除的方法
public void delNodeById(int id) {
int index = hashFun(id);
if (empLinkedlistArray[index] == null) {
System.out.println("没有找到");
return;
}
// 调用结点的删除进行删除
empLinkedlistArray[index].delNodeByid(id);
}
}
简单的hash表完成。