双向节点

/*** Created by root on 16-3-6.*/
public class Node<E> {public E data;public Node prev;public Node next;public Node(E target,Node prev,Node next){//链接两个孤立节点data=target;this.prev=prev;this.next=next;}public Node(){this(null,null,null);}public Node(E target){this(target,null,null);}
}

双向链表 用于存储数据单元

/*** Created by root on 16-3-6.*/
public class MyLinkedList<E> {private Node beginMaker;private Node endMaker;private int size;   //lengthpublic boolean isEmpty(){return beginMaker.next==endMaker;}public MyLinkedList() {  //ConstructorbeginMaker = new Node();endMaker = new Node(null, beginMaker, null);//链接beginMaker和endMakerbeginMaker.next=endMaker;size = 0;}public MyLinkedList(int thatSize, E target) {  //Constructorthis();size = thatSize;for (int i = 0; i < size; i++) {this.add(target);}}public void add(E target) {Node node = new Node(target, endMaker.prev, endMaker);//增加一个节点 要4步node.prev.next = node;endMaker.prev = node;size++;}public boolean contains(E target) {//双向搜索Node node = findNode(target);if (node != null) {return true;} else {return false;}}public boolean remove(E target) { //deleteNode node = findNode(target);if (node != null) {node.prev.next = node.next;//把前节点和后节点链接node.next.prev = node.prev;size--;return true;}return false;}private Node findNode(E target) {//双向搜索Node node1 = beginMaker.next;Node node2 = endMaker.prev;if(isEmpty())return null;for (int i = 0; i <= size / 2; i++) {if (node1.data.equals(target)) {return node1;} else if (node2.data.equals(target)) {return node2;} else {node1 = node1.next;node2 = node2.prev;}}return null;}public Node getNode(int index) {//根据Index和 size/2 分类搜索if (index >= size) {throw new IndexOutOfBoundsException();} else if (index < size / 2) {Node node = beginMaker.next;for (int i = 0; i < index; i++) {node = node.next;}return node;} else {Node node = endMaker.prev;for (int i = size - 1; i > index; i--) {node = node.prev;}return node;}}}

HashTable List 用于存放双向链表 构成一个十字链表

/*** Created by root on 16-3-6.*/
public class HashTableList {public static class hNode {MyLinkedList data;hNode prev;hNode next;public hNode(MyLinkedList list, hNode prev, hNode next) {data = list;this.prev = prev;this.next = next;}}public hNode beginMaker;public hNode endMaker;public int size;public HashTableList() {beginMaker = new hNode(null, null, null);endMaker = new hNode(null, beginMaker, null);size = 0;}public HashTableList(int size) {this();for (int i = 0; i < size; i++) {this.add(new MyLinkedList());}}public void add(MyLinkedList target) {hNode node = new hNode(target, endMaker.prev, endMaker);node.prev.next = node;endMaker.prev = node;size++;}public hNode gethNode(int index) {//根据Index和 size/2 分类搜索if (index >= size) {throw new IndexOutOfBoundsException();} else if (index < size / 2) {hNode node = beginMaker.next;for (int i = 0; i < index; i++) {node = node.next;}return node;} else {hNode node = endMaker.prev;for (int i = size - 1; i > index; i--) {node = node.prev;}return node;}}}

HashTable 用于增加 和 删除 以及查找

/*** Created by root on 16-3-6.*/
public class HashTable<E> {HashTableList list;int size;public HashTable(int size) {list = new HashTableList(size);this.size = size;}public void insert(E target) {int hashVal = myHash(target);MyLinkedList myLinkedList = list.gethNode(hashVal).data;if (!myLinkedList.contains(target)) {myLinkedList.add(target);}}public boolean remove(E target) {int hashVal = myHash(target);MyLinkedList myLinkedList = list.gethNode(hashVal).data;return myLinkedList.remove(target);}public int myHash(E target) {int hashVal = target.hashCode();hashVal %= size;if (hashVal < 0) {hashVal += size;}return hashVal;}public int contains(E target) {int hashVal = myHash(target);MyLinkedList myLinkedList = list.gethNode(hashVal).data;if (myLinkedList.contains(target)) {return hashVal;} else {return -1;}}
}

测试类

/*** Created by root on 16-3-6.*/
public class Test {public static void main(String[] args){HashTable hashTable=new HashTable(11) ;hashTable.insert(12);hashTable.insert("sjkljg");hashTable.insert(145);System.out.println(hashTable.contains(12));System.out.println(hashTable.contains(145));System.out.println(hashTable.contains("sjkljg"));hashTable.remove(12);System.out.println(hashTable.contains(12));}
}

输出结果

1
2
9
-1

转载于:https://www.cnblogs.com/Salaku/p/5247487.html

Java数据结构--HashTable(拉链法)相关推荐

  1. 九, Java实现哈希表(拉链法, 数组+单链表)

    九, 哈希表 9.1 哈希表的定义和特点 散列表(Hash table, 也叫哈希表),是根据关键码 - 值(Key - value)而直接进行访问的数据结构. 也就是说, 它通过把关键码 - 值映射 ...

  2. 06 数据结构与算法之哈希表(拉链法) (C语言实现)

    注:只给出C语言实现代码,涉及到的数据结构相关概念请自行阅读相关书籍或参考其他博文: 将哈希表理解为一个顺序表,顺序表里面存储的是一个链表(拉链法解决碰撞) 注:(hash & 0x7FFFF ...

  3. binarysearch java,java数据结构之二分查找法 binarySearch的实例

    java数据结构之二分查找法 binarySearch的实例 折半查找法,前提是已经排好序的数组才可查找 实例代码: public class BinarySearch { int[] bArr; p ...

  4. 数据结构——拉链法(链地址法)

    当存储结构是链表时,多采用拉链法,用拉链法处理冲突的办法是:把具有相同散列地址的关键字(同义词)值放在同一个单链表中,称为同义词链表.有m个散列地址就有m个链表,同时用指针数组T[0..m-1]存放各 ...

  5. java队列_如何彻底搞懂 Java 数据结构?CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  6. Java数据结构和算法:HashMap的实现原理

    HashMap源码理解 Java集合之HashMap HashMap原理及实现学习总结 HashMap源码分析 HashMap原理及实现学习总结 1. HashMap概述 HashMap是基于哈希表的 ...

  7. java 固定长度队列_如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  8. 如何彻底搞懂 Java 数据结构?|CSDN 博文精选

    作者 | 张振华.Jack 责编 | 郭芮 出品 | CSDN 博客 本文和大家一起来重温<Java数据结构>经典之作. Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

  9. Java数据结构与算法入门

    原文:https://blog.csdn.net/qq_37101453/article/details/80142147 第一部分:Java数据结构 要理解Java数据结构,必须能清楚何为数据结构? ...

最新文章

  1. 横向ListView(一) ——开篇,基础逻辑实现
  2. find与findb
  3. windows双机调试
  4. easyui tree的简单使用
  5. 江苏省计算机二级用英语,江苏省计算机二级考试(VB)最新大纲及要求(国外英语资料).doc...
  6. javaee utf-8文件的转换
  7. 七月算法机器学习 11 决策树、随机森林、 adaboost
  8. Shiro权限控制框架
  9. Javashop连锁门店系统帮助企业快速搭建自己企业商城
  10. 计算机一级考试 文字录入,计算机一年级《文字录入》期末考试题(理论)B
  11. 服务器搬迁方案_服务器搬迁方案规定搬迁之前也需要大扫除
  12. 单元测试--Mockito之spy
  13. BitTorrent Sync简介
  14. 魔兽是用Python开发的,一起看看Python开发的知名网站和游戏!
  15. 题目 2281: 次数差
  16. 选生物化学历史能不能报计算机专业,选历史同样可以当医生,想要学医的看过来,这是一份全面指导...
  17. Flutter仿美团应用开发笔记-首页 (1)
  18. 旧电脑搭建linux服务器
  19. Python 操作XML文件一文通
  20. 计算机考证等级有用吗

热门文章

  1. Linux 关机命令详解 转自脚本之家
  2. 洛谷——P1546 最短网络 Agri-Net
  3. bash知识点:文件测试
  4. poj 3348 Cows 求凸包以及凸包的面积
  5. fail2ban封IP之Http
  6. 让Sql Server也能出现如VS一样的智能提示工具--资源更新
  7. 在SQL Server2005中进行错误捕捉
  8. 数据库不停机导数据方案_如何计算数据停机成本
  9. 关于java static 关键字
  10. leetcode 721. 账户合并(并查集)