package com.gxmedu.hash_table_demo;
/**
* @author 郭学明
* @version 1.0
*/
public class HashTable_ {
public static void main(String[] args) {
HashTable_ hashTable_ = new HashTable_(10);
// hashTable_.show();
// hashTable_.add(hashTable_.new Node(5,"a"));
hashTable_.addById(hashTable_.new Node(5,"a"));
hashTable_.addById(hashTable_.new Node(15,"b"));
hashTable_.addById(hashTable_.new Node(4,"1b"));
hashTable_.addById(hashTable_.new Node(3,"2v"));
hashTable_.update(hashTable_.new Node(3,"gg"));
hashTable_.find(15);
// hashTable_.show();
System.out.println( hashTable_.find(15));
}
private SingleLinkedList[] hashTable;
private int length;
public class Node{
private int id;//这是简化版的key
private String name;//这是简化版的value
private Node next;
public Node(){}
public Node(int id, String name){
this.id = id;
this.name = name;
}
@Override
public String toString() {
return "Node{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
public class SingleLinkedList{
private Node headNode;
/**
* 默认添加到链表最后一个位置
* @param node
*/
public void addNode(Node node){
if(headNode == null){
headNode = node;
return;
}
Node temp = headNode;
while(true){
if(temp.next == null){
temp.next = node;
break;
}
temp = temp.next;
}
}
/**
* 按id来添加节点
*/
public void addNodeById(Node node){
if(headNode == null){
headNode = node;
return;
}
Node temp = headNode;
// temp.next = headNode;
while(true){
if(node.id < headNode.id){
node.next = headNode;
headNode = node;
break;
}
if(node.id == temp.id){
System.out.println("id重复无法添加");
break;
}
if(temp.next == null){
temp.next = node;
break;
}
if(node.id < temp.next.id){
node.next = temp.next;
temp.next = node;
break;
}
// if(node.id == temp.next.id){
// System.out.println("id重复无法添加");
// break;
// }
temp = temp.next;
}
}
/**
* 改节点
*/
public void updateNode(Node node){
// int id = node.id;
if(headNode == null){
System.out.println("链表为空");
return;
}
Node temp = headNode;
boolean flag = false;
// 可以减少修改动作代码重复次数
while(true){
/* 这样子更改,链表会断
if(temp.id == id){
}*/
// 因为没有默认头节点,所以需要增加一个修改节点是否是第一个节点的判断
// 因为不是替换整个节点,所以不用做如上考虑
if(temp.id == node.id){
flag = true;
temp.name = node.name;
}
if(temp.next == null){
break;
}
temp = temp.next;
}
if(!flag){
System.out.printf("未找到id为%d的节点",node.id);
}
}
/**
* 删节点
*/
public void deleteNode(int id){
if(headNode == null){
System.out.println("链表为空");
return;
}
Node temp = headNode;
boolean flag = false;
while(true){
// 因为没有传统头节点,所以要进行这个判断
if(headNode.id == id){
headNode = headNode.next;
flag = true;
break;
}
if(temp.next == null){
break;
}
if(temp.next.id == id){
temp.next = temp.next.next;
flag = true;
break;
}
temp = temp.next;
}
if(!flag){
System.out.printf("未找到id为%d的节点,删除失败",id);
}
}
/**
* 查找节点
*/
public Node findNode(int id){
if(headNode == null){
System.out.println("链表为空");
return null;
}
Node temp = headNode;
while(true){
if(temp.id == id){
return temp;
}
if(temp.next == null){
return null;
}
temp = temp.next;
}
}
/**
* 遍历链表
*/
public void showLinkedList(int id){
if(headNode == null){
System.out.println("第" + (id + 1) + "链表为空");
return;
}
Node temp = headNode;
System.out.print("第" + (id + 1) + "链表内容为");
while(true){
System.out.print("===> " + temp +" ");
if(temp.next == null){
System.out.println();
break;
}
temp = temp.next;
}
}
}
public HashTable_(int length){
this.length = length;
hashTable = new SingleLinkedList[length];
for (int i = 0; i < length; i++) {
hashTable[i] = new SingleLinkedList();
}
}
public int hashFunction(int id){
return id % length;
}
public void add(Node node){
int linkedListNum = hashFunction(node.id);
hashTable[linkedListNum].addNode(node);
}
public void addById(Node node){
int num = hashFunction(node.id);
hashTable[num].addNodeById(node);
}
public void delete(int id){
int num = hashFunction(id);
hashTable[num].deleteNode(id);
}
public void update(Node node){
int num = hashFunction(node.id);
hashTable[num].updateNode(node);
}
public Node find(int id){
int num = hashFunction(id);
return hashTable[num].findNode(id);
}
public void show (){
for (int i = 0; i < length; i++) {
hashTable[i].showLinkedList(i);
}
}
}
java hashtable
最新推荐文章于 2024-06-14 15:02:13 发布