哈希表结构介绍与实现

1. 基本介绍

  • 哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构。
  • 哈希表通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。
    哈希表结构

2. 使用代码实现主要功能

  • 创建节点类
/**
 * 表示一个节点
 */
class Node {
	private int id;
	private Node next; // next 默认为 null

	public Node(int id) {
		this.id = id;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Node getNext() {
		return next;
	}

	public void setNext(Node next) {
		this.next = next;
	}

}
  • 创建节点链表集合类
/**
 * 创建NodeLinkedList,表示链表
 */
class NodeLinkedList {
	// 头指针,执行第一个节点,因此我们这个链表的head是直接指向第一个节点
	private Node head;

	// 添加节点到链表
	public void add(Node node) {
		// 如果是添加第一个节点
		if (head == null) {
			head = node;
			return;
		}
		// 如果不是第一个节点,则使用一个辅助的指针,帮助定位到最后
		Node curNode = head;
		while (true) {
			if (curNode.getNext() == null) {
				break;
			}
			curNode = curNode.getNext();
		}
		curNode.setNext(node);
	}

	// 遍历链表的节点信息
	public void list(int no) {
		if (head == null) {
			System.out.println("第 " + (no + 1) + " 链表为空");
			return;
		}
		System.out.print("第 " + (no + 1) + " 链表的信息为");
		Node curNode = head;
		while (true) {
			System.out.printf(" => id=%d\t", curNode.getId());
			if (curNode.getNext() == null) {
				break;
			}
			curNode = curNode.getNext();
		}
		System.out.println();
	}

	// 根据id查找节点
	public Node findNodeById(int id) {
		if (head == null) {
			System.out.println("链表为空");
			return null;
		}
		Node curNode = head;
		while (true) {
			if (curNode.getId() == id) {
				break;
			}
			if (curNode.getNext() == null) {
				curNode = null;
				break;
			}
			curNode = curNode.getNext();
		}

		return curNode;
	}

}
  • 创建哈希表结构和功能
/**
 * 管理多条链表
 **/
class HashTab {
	private NodeLinkedList[] nodeLinkedListArray;
	private int size; // 表示有多少条链表

	public HashTab(int size) {
		this.size = size;
		nodeLinkedListArray = new NodeLinkedList[size];
		// 初始化每个链表
		for (int i = 0; i < size; i++) {
			nodeLinkedListArray[i] = new NodeLinkedList();
		}
	}

	// 添加节点
	public void add(Node node) {
		int nodeLinkedListNO = hashFun(node.getId());
		nodeLinkedListArray[nodeLinkedListNO].add(node);
	}

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

	// 根据输入的id查找节点
	public void findNodeById(int id) {
		int nodeLinkedListNO = hashFun(id);
		Node node = nodeLinkedListArray[nodeLinkedListNO].findNodeById(id);
		if (node != null) {
			System.out.printf("在第%d条链表中找到节点 id = %d\n", (nodeLinkedListNO + 1), id);
		} else {
			System.out.println("没有找到该雇员~");
		}
	}

	// 编写散列函数, 使用一个简单取模法
	private int hashFun(int id) {
		return id % size;
	}

}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值