链表哈希表的简单思路及其实现

哈希表的实现其实数组+链表,只要掌握了链表的操作写哈希表并不难。
哈希表有一个数组,里面存放的是链表,哈希表会根据一个函数决定把数据存入到哪条链表,并对其操作
在这里插入图片描述
首先先实现一个链表
这是一个雇员类:

public class Emp {
    public int id;
    public String name;
    public Emp next;

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

这是一条链表:
里面只包含了添加和列举方法,都是链表基本操作

public class EmpList {
    //头节点
    private Emp head;
    /**
     * 添加数据
     * @param emp
     */
    public void add(Emp emp){
        if (head == null){
            head = emp;
            return;
        }
        Emp temp = head;
        if (temp.next == null){
            temp.next = emp;
        }else {
            temp = temp.next;
        }
    }
    /**
     * 展示数据
     */
    public void List(int id){
        if (head == null){
            System.out.println("第"+(id+1)+"链表为空");
            return;
        }
        Emp temp = head;
        do {
            System.out.printf("第"+(id+1)+"条链表=> id=%d name=%s \t",temp.id,temp.name);
            temp = temp.next;
        }while (temp != null);
        System.out.println();
    }
}

最后是哈希表:
哈希表里有一个链表数组和一个散列函数,散列函数的实现方法有很多,这里就列举简单的取模。存取数据时由散列函数决定存到哪条链表。

public class HashTable {
    private EmpList[] empLists;
    private int size;//链表的条数

    public HashTable(int size){
        this.size = size;
        empLists = new EmpList[size];
        for (int i=0; i<size; i++){
            empLists[i] = new EmpList();
        }
    }
	//添加数据
    public void add(Emp emp){
        //决定添加进哪条链表
        int target = hashFun(emp.id);
        empLists[target].add(emp);
    }

    //遍历所有链表
    public void List(){
        for (int i=0; i<size; i++){
            empLists[i].List(i);
        }
    }

    //散列函数
    public int hashFun(int id){
        return id % size;
    }
}

使用哈希表

public static void main(String[] args) {
        HashTable hashTable = new HashTable(5);
        hashTable.add(new Emp(1,"aaa"));
        hashTable.add(new Emp(2,"bbb"));
        hashTable.add(new Emp(3,"ccc"));
        hashTable.add(new Emp(4,"ddd"));
        hashTable.add(new Emp(5,"eee"));
        hashTable.add(new Emp(6,"fff"));
        hashTable.List();
    }

结果

1条链表=> id=5 name=eee 	
第2条链表=> id=1 name=aaa 	第2条链表=> id=6 name=fff 	
第3条链表=> id=2 name=bbb 	
第4条链表=> id=3 name=ccc 	
第5条链表=> id=4 name=ddd 	

Process finished with exit code 0

增删查改的方法定义在EmpList里,也就是链表里,和普通的链表操作没什么区别,HashTable类只是根据散列函数决定对哪一条链表进行操作。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值