前言
为什么有这个哈希链表呢?
首先来看一张图:
这种就是哈希链表。为什么要这样做呢?
如果是数组存储的话,存在一个问题,那就是扩容。
如果是链表的时候,那么存在查询需要遍历整个链表。
这个哈希链表就是两者的结合。
正文
代码如下:
class HashTab {
private EmpLinkedList[] empLinkedListArray;
private int size;// 数组的长度
public HashTab(int size)
{
this.size = size;
empLinkedListArray = new EmpLinkedList[size];
for (int i = 0; i < size; i++)
{
empLinkedListArray[i] = new EmpLinkedList();
}
}
public void addEmp(Emp emp)
{
int index = hash(emp.id);
empLinkedListArray[index].add(emp); ;
}
public Emp findEmpById(int id)
{
var index = hash(id);
return empLinkedListArray[index].findEmpById(id);
}
public void list()
{
for (int i = 0; i < size; i++)
{
empLinkedListArray[i].list();
}
}
/// <summary>
/// 进行hash
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
private int hash(int id)
{
return id % size;
}
}
public class Emp
{
//编号
public int id;
//姓名
public string name;
//Link next
public Emp next;
public Emp(int id, string name)
{
this.id = id;
this.name = name;
}
}
public class EmpLinkedList
{
//头指针
private Emp head;
/// <summary>
/// 增加链表元素
/// </summary>
/// <param name="emp">新增链表元素</param>
public void add(Emp emp)
{
if (head == null)
{
head = emp;
return;
}
Emp curEmp = head;
while (true)
{
if (curEmp.next != null)
{
curEmp = curEmp.next;
}
else
{
break;
}
}
curEmp.next = emp;
}
/// <summary>
/// 展示栈中数据
/// </summary>
public void list()
{
if (head == null)
{
Console.WriteLine("链表为空");
return;
}
Emp curEmp = head;
while (true)
{
Console.Write(curEmp.name+" ");
if (curEmp.next == null)
{
break;
}
curEmp = curEmp.next;
}
Console.WriteLine();
}
/// <summary>
/// 寻找链表中的元素
/// </summary>
/// <param name="id">元素id</param>
/// <returns></returns>
public Emp findEmpById(int id)
{
if (head == null)
{
//实际项目中抛出异常
Console.WriteLine("链表为空");
return null;
}
Emp curEmp = head;
while (true)
{
if (curEmp.id == id)
{
return curEmp;
}
if (curEmp.next == null)
{
return null;
}
curEmp=curEmp.next;
}
}
}
测试代码:
static void Main(string[] args)
{
HashTab Emps = new HashTab(7);
Emps.addEmp(new Emp(10,"张三"));
Emps.addEmp(new Emp(17, "小二"));
Emps.addEmp(new Emp(100, "李老板"));
Emps.list();
Console.Read();
}
运行结果: