目录
按照id删除元素
按照id有序加入元素
完整代码:
按照id删除元素
比较id,如果删除头元素并且头元素的next不为空,可以直接将head后移,因为遍历是以头元素开始遍历的,所以也可以达成删除的效果。如果头元素的next为空,可以直接将头元素置空。
比较id,如果删除中间的元素或者末尾元素,将对应连接节点置空即可。
思路如图:
代码
public boolean deleteEmpById(int id){
//判断是否为空
if (head == null){
return false;
}
//如果头结点需要删除
if (head.id == id){
//如果头结点next不为空,将头结点后移
if (head.next != null) {
head = head.next;
} else {
//链表只有一个头结点
head = null;
}
return true;
}
Emp curEmp = head;
while (curEmp.next != null){
//如果curEmp指针指向next的id等于要删除的id,并且curEmp.next.next不等于空
//则将curEmp指针指向curEmp.next.next
if (curEmp.next.id == id && curEmp.next.next != null){
curEmp.next = curEmp.next.next;
//置空
curEmp.next.next = null;
return true;
} else if (curEmp.next.id == id){
//curEmp.next已经是最后一个,直接置空即可
curEmp.next = null;
return true;
}
//将指针向后移
curEmp = curEmp.next;
}
return false;
}
按照id有序加入元素
思路类似于删除元素,比较id选择合适的位置加入元素。
思路如图:
代码
//id从小到大有序加入元素
public void addById(Emp emp){
//如果是第一个
if (head == null){
head = emp;
return;
}
Emp curEmp = head;
//临时变量
Emp temp = null;
//如果不是,比较id
//如果比head的id小
if (emp.id < head.id){
//加到head前面
head = emp;
emp.next = curEmp;
return;
}
while (curEmp.next != null){
if (emp.id < curEmp.next.id){
//将emp插入到中间
temp = curEmp.next;
curEmp.next = emp;
emp.next = temp;
return;
}
// curEmp 向后移动
curEmp = curEmp.next;
}
//没有找到合适位置,放到最后
curEmp.next = emp;
}
完整代码:
public class HashTableDemo {
public static void main(String[] args) {
HashTab hashTab = new HashTab(7);
String key = " ";
Scanner in = new Scanner(System.in);
while (true){
System.out.println("add:添加雇员");
System.out.println("list:显示雇员");
System.out.println("find:查找雇员");
System.out.println("delete:删除雇员");
System.out.println("exit:退出系统");
System.out.print("请输入你的选择:");
key = in.next();
switch (key){
case "add":
System.out.print("输入id:");
int id = in.nextInt();
System.out.print("输入名字:");
String name = in.next();
Emp emp = new Emp(id, name);
hashTab.add(emp);
break;
case "list":
hashTab.list();
break;
case "find":
System.out.print("输入要查找的id:");
id = in.nextInt();
hashTab.findEmpById(id);
break;
case "delete":
System.out.print("输入要删除的雇员id:");
id = in.nextInt();
hashTab.deleteEmpById(id);
break;
case "exit":
in.close();
System.exit(0);
break;
}
}
}
}
//创建hashTab
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 add(Emp emp){
//根据员工id得到该员工应该添加到哪条链表
int emLinkedListNo = hashFun(emp.id);
//将emp添加到对应的链表中
empLinkedListArray[emLinkedListNo].addById(emp);
}
//遍历左右的链表
public void list(){
for (int i = 0; i < size; i++) {
empLinkedListArray[i].list(i);
}
}
//根据id查找雇员
public void findEmpById(int id){
int empLinkedListNo = hashFun(id);
Emp emp = empLinkedListArray[empLinkedListNo].findEmpById(id);
if (emp != null){
System.out.printf("在第%d条链表中找到雇员,id=%d\n", (empLinkedListNo + 1), id);
} else {
System.out.println("没有找到该雇员");
}
}
//根据id删除雇员
public void deleteEmpById(int id){
int empLinkedListNo = hashFun(id);
boolean b = empLinkedListArray[empLinkedListNo].deleteEmpById(id);
if (b){
System.out.println("成功删除id:"+ id +"的雇员");
} else {
System.out.println("删除失败");
}
}
//编写散列函数
public int hashFun(int id){
return id % size;
}
}
//创建雇员
class Emp{
public int id;
public String name;
public Emp next;
public Emp(int id, String name) {
this.id = id;
this.name = name;
}
}
//创建EmpLinkedList,表示链表
class EmpLinkedList{
//头指针,指向第一个emp
private Emp head;
//当添加雇员时,id是自增长,id从小到大
//将雇员直接加入到本链表最后
public void add(Emp emp){
//如果是第一个
if (head == null){
head = emp;
return;
}
//如果不是第一个,辅助指针定位到最后
Emp curEmp = head;
while (true){
if (curEmp.next == null){
break;
}
curEmp = curEmp.next;//后移
}
//退出时将emp加入
curEmp.next = emp;
}
//id从小到大有序加入元素
public void addById(Emp emp){
//如果是第一个
if (head == null){
head = emp;
return;
}
Emp curEmp = head;
//临时变量
Emp temp = null;
//如果不是,比较id
//如果比head的id小
if (emp.id < head.id){
//加到head前面
head = emp;
emp.next = curEmp;
return;
}
while (curEmp.next != null){
if (emp.id < curEmp.next.id){
//将emp插入到中间
temp = curEmp.next;
curEmp.next = emp;
emp.next = temp;
return;
}
// curEmp 向后移动
curEmp = curEmp.next;
}
//没有找到合适位置,放到最后
curEmp.next = emp;
}
//遍历链表
public void list(int no){
//说明链表为空
if (head == null){
System.out.println("第 " + (no + 1) + " 链表为空");
return;
}
System.out.print("第 " + (no + 1) + " 链表的信息为:");
Emp curEmp = head; //辅助
while (true){
System.out.printf("=> id=%d name=%s\t" , curEmp.id, curEmp.name);
//满足已经是最后节点
if (curEmp.next == null){
break;
}
curEmp = curEmp.next;
}
System.out.println();
}
//根据id查找雇员,没有找到返回null
public Emp findEmpById(int id){
//判断是否为空
if (head == null){
return null;
}
Emp curEmp = head;
while (true){
if (curEmp.id == id){ //找到
break;
}
//说明没有找到
if (curEmp.next == null){
curEmp = null;
break;
}
curEmp = curEmp.next;
}
return curEmp;
}
//按照id删除元素
public boolean deleteEmpById(int id){
//判断是否为空
if (head == null){
return false;
}
//如果头结点需要删除
if (head.id == id){
//如果头结点next不为空,将头结点后移
if (head.next != null) {
head = head.next;
} else {
//链表只有一个头结点
head = null;
}
return true;
}
Emp curEmp = head;
while (curEmp.next != null){
//如果curEmp指针指向next的id等于要删除的id,并且curEmp.next.next不等于空
//则将curEmp指针指向curEmp.next.next
if (curEmp.next.id == id && curEmp.next.next != null){
curEmp.next = curEmp.next.next;
//置空
curEmp.next.next = null;
return true;
} else if (curEmp.next.id == id){
//curEmp.next已经是最后一个,直接置空即可
curEmp.next = null;
return true;
}
//将指针向后移
curEmp = curEmp.next;
}
return false;
}
}
还在学习中,有问题辛苦指出。