链表(Linked List)介绍

链表是有序的列表,但是它在内存中是存储如下

小结:

1、链表是以节点的方式来存储,是链式存储。

2、每个节点包含 data 域, next 域:指向下一个节点。

3、如图:发现链表的各个节点不一定是连续存储。

4、链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定。

 单链表介绍

单链表(带头结点) 逻辑结构示意图如下

单链表的应用实例
使用带head头的单向链表实现 –水浒英雄排行榜管理
完成对英雄人物的增删改查操作
第一种方法在添加英雄时,直接添加到链表的尾部
第二种方式在添加英雄时,根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示)
代码

package com.lin.linkedlist_0131;

import java.security.Signature;

/**
* 在内存里面直接将数据排好,不用在数据库里面排,效率高
* @Description:
* @author LinZM
* @date 2021-1-31 20:40:54
* @version V1.8
*/
public class SingleLinkedListTest { public static void main(String[] args) {
SingleLinkedList singleLinkedList = new SingleLinkedList();
singleLinkedList.addHero(new HeroNode(1, "伍六七", "柒"));
singleLinkedList.addHero(new HeroNode(2, "赵六", "陆"));
singleLinkedList.addHero(new HeroNode(3, "一二三", "叁"));
singleLinkedList.addHero(new HeroNode(4, "李爸爸", "捌"));
singleLinkedList.list();
System.out.println("****************根据排名添加英雄***********************");
singleLinkedList.addHeroByOrder(new HeroNode(2, "赵六", "陆"));
singleLinkedList.addHeroByOrder(new HeroNode(5, "李妈妈", "玛"));
singleLinkedList.list();
System.out.println("****************修改英雄***********************");
singleLinkedList.updateHero(new HeroNode(3, "一三三", "三叁"));
singleLinkedList.list();
System.out.println("****************根据no删除英雄***********************");
singleLinkedList.deleteHero(1);
singleLinkedList.list(); }
} /**
*
* @Description: 定义SingleLinkedList管理英雄
* @author LinZM
* @date 2021-1-31 20:46:53
* @version V1.8
*/
class SingleLinkedList{
// 初始化头结点,一般不动
private HeroNode head = new HeroNode(0, "", ""); /**
* 添加节点到单向链表
* 1 找到当前链表的最后节点
* 2 将最后这个节点的next指向新的节点
* @Description:
* @author LinZM
* @date 2021-1-31 21:12:23
* @version V1.8
*/
public void addHero(HeroNode heroNode){
// 因为head节点不能动,因此我们需要一个辅助变量temp
HeroNode temp = head;
// 遍历链表,找到最后节点
while(true) {
if(temp.next == null) {
break;
}
// 如果没有找到,就将这个temp后移
temp = temp.next;
}
// 当循环结束时,temp指向链表最后
// 将最后这个节点的next指向新的节点
temp.next = heroNode;
} /**
* 第二种方式添加英雄是,根据排名将英雄插入到指定位置(如果相同排名则插入失败)
* @Description:
* @author LinZM
* @date 2021-1-31 21:49:46
* @version V1.8
*/
public void addHeroByOrder(HeroNode heroNode) {
HeroNode temp = head;
boolean flag = false;// 标识添加的编号是否存在
while(true) {
if(temp.next == null) {
break;
}
if(temp.next.no > heroNode.no) {
break;
}else if(temp.next.no == heroNode.no) {
flag = true;
break;
}
temp = temp.next;
}
// 退出循环后
// 判断flag
if(flag) {
System.out.printf("待插入的英雄的编号%d已经存在,不能添加了\n",heroNode.no);
} else {
// 尾插法
// 新节点.next = temp.next
// temp.next = 新节点
heroNode.next = temp.next;
temp.next = heroNode;
} } /**
* 修改节点的信息,根据no编号来修改,即no不能修改
* @Description:
* @author LinZM
* @date 2021-1-31 21:50:01
* @version V1.8
*/
public void updateHero(HeroNode heroNode) {
if(head.next == null) {
System.out.println("链表为空!");
return;
}
HeroNode temp = head;
boolean flag = false; // 标识是否找到目标
while(true) {
if(temp.next == null) {
break;
}
if(temp.no == heroNode.no ) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.name = heroNode.name;
temp.nickname = heroNode.nickname;
} else {
System.out.println("没有找英雄!");
}
} // 删除节点
// 1 首先遍历单链表找到节点,如果没有则做出相应提示
// 2 找到要删除节点的前一个节点后进行删除操作
// 1) temp.next = temp.next.next
// 2) 被删除的节点将不会有其他的引号指向,会垃圾回收机制回收
public void deleteHero(int no) { HeroNode temp = head;
boolean flag = false;
while(true) {
if(temp.next == null) {// 如果为空链表则break
break;
}
if(temp.next.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
temp.next = temp.next.next;
} else {
System.out.println("没有找到相应的英雄!");
}
} // 根据no找英雄
public HeroNode findHeroByNo(int no) {
HeroNode temp = head;
boolean flag = false;
while(true) {
if(temp.next == null) {
throw new RuntimeException("链表为空");
}
if(temp.no == no) {
flag = true;
break;
}
temp = temp.next;
}
if(flag) {
return temp;
} else {
throw new RuntimeException("没有找到相应的英雄!");
}
}
/**
* 显示链表
* @Description:
* @author LinZM
* @date 2021-1-31 21:50:06
* @version V1.8
*/
public void list() {
// 判断链表是否为空
if(head.next == null) {
System.out.println("链表为空!");
return;
}
// 因为头结点不动,因此我们需要一个辅助变量temp
HeroNode temp = head.next;
while(true) {
// 判断是否到链表最后
if(temp == null) {
break;
}
// 输出链表信息
System.out.println(temp);
temp = temp.next;
} }
} /**
*
* @Description: 定义HeroNode,每个HeroNode对象时一个节点
* @author LinZM
* @date 2021-1-31 20:47:02
* @version V1.8
*/
class HeroNode{
public int no;
public String name;
public String nickname;
public HeroNode next; public HeroNode(int no, String name, String nickname) {
super();
this.no = no;
this.name = name;
this.nickname = nickname;
} @Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";
} }

仅供参考,有错误还请指出!

有什么想法,评论区留言,互相指教指教。

Java链表(英雄增删查改)的更多相关文章

  1. java中CRUD(增删查改)底层代码的实现

    java中CRUD(增删查改)底层代码的实现: package com.station.dao; import com.station.model.Product; import java.sql.* ...

  2. MongoDB在Java下的增删查改

    我们总不能一直使用cmd对数据库操作,数据库总是要在程序中使用的.今天来说一下怎么通过Java调用MongoDB. 学习一下最基本也是最常用的增删查改语句,这是使用数据库的基础. 注意事项: 1.要打 ...

  3. Java实现单链表的增删查改及逆置打印

    //所提供的接口 LinkList.java package Struct; public interface LinkList {//判断链表为空public boolean linkListIsE ...

  4. c++链表-双向链表+增删查改

    基于双向链表的增删改查和排序(C++实现) 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱.所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前 ...

  5. C语言 链表的使用(链表的增删查改,链表逆转,链表排序)

    //链表的使用 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include< ...

  6. java实现简单的数据库的增删查改,并布局交互界面

        一.系统简介 1.1.简介  本系统提供了学生信息管理中常见的基本功能,主要包括管理员.管理员的主要功能有对学生信息进行增加.删除.修改.查找等操作,对信息进行管理,对信息进行修改.查找等操作 ...

  7. Java连接MySQL数据库及简单的增删查改操作

    主要摘自 https://www.cnblogs.com/town123/p/8336244.html https://www.runoob.com/java/java-mysql-connect.h ...

  8. java:Hibernate框架1(环境搭建,Hibernate.cfg.xml中属性含义,Hibernate常用API对象,HibernteUitl,对象生命周期图,数据对象的三种状态,增删查改)

    1.环境搭建: 三个准备+7个步骤 准备1:新建项目并添加hibernate依赖的jar文件  准备2:在classpath下(src目录下)新建hibernate的配置文件:hibernate.cf ...

  9. JAVA原生mvc实现用户信息的增删查改

    笔者最近学完jsp和servlet,于是心血来潮的打算写个简单的用户案例 环境准备: 开发工具eclipse jdk-1.8.0_72 tomcat-9.0.5 前端部分: 1.自己手写了一套样式 2 ...

随机推荐

  1. 前端学习总结之——HTML

    近期在找工作参加面试,想总结一下学过的东西,也会持续更新遇到的新问题.盲点. 什么是HTML? 超文本标记语言(英语:HyperText Markup Language,简称:HTML),由尖括号包围 ...

  2. linux的 复制 删除 解压 压缩 打包

    liunx 删除 删除文件夹实例: rm -rf /var/log/httpd/access 将会删除/var/log/httpd/access目录以及其下所有文件.文件夹 2 删除文件使用实例: r ...

  3. 如何在Linux(CentOS7)环境搭建 Jenkins 服务器环境

    最近,我自己要亲手搭建一套完整的企业级 CI/CD 环境,这个环节里面涉及了很多内容,没有办法把这么多的内容都放在一篇文章里,所以 Jenkins 的安装和Java 的 JDK 安装我就是分了两篇文章 ...

  4. Oracle 模糊查询 优化

    模糊查询是数据库查询中经常用到的,一般常用的格式如下: (1)字段  like '%关键字%'   字段包含"关键字"的记录   即使在目标字段建立索引也不会走索引,速度最慢 (2 ...

  5. go语言实现99乘法表

    Go语言学习笔记(99乘法表)-day01 通过for循环实现99乘法表 预期效果 源代码 for x :=1;x<10;x++{ for y :=1;x>=y;y++{ fmt.Prin ...

  6. NOIP初赛篇——03中央处理器CPU

    CPU ​ CPU(中央处理单元)是微机的核心部件,是决定微机性能的关键部件.20世纪70年代微型机的CPU问世,微型计算机的核心部件微处理器从Intel 4004,80286,80386,80486 ...

  7. 【Java基础】数组和算法

    数组和算法 查找算法 线性查找 ... 二分查找 二分查找要求数据结构是有序的. package com.parzulpan.java.ch03; /** * @Author : parzulpan ...

  8. requests +httprunne r

    1.get 请求和 post 请求的区别是什么?  2.requests 模拟 get 请求时,有哪两种方式让响应的结果不是乱码?(直接代码描述)  3.requests 库中的 post 方法,参数 ...

  9. MySQL查询优化之 index 索引的分类和使用

    索引的分类 主键索引 (PRIMARY KEY) 唯一的标识符, 主键不可重复, 只能有一列作为主键 唯一索引 (Unique KEY) 避免重复的列出现, 唯一索引可以重复, 多个列都可以标识为唯一 ...

  10. xtrabackup 备份与恢复

    书上摘抄 ---深入浅出mysql 448页  grant reload on *.* to 'backup'@'localhost' identified by '123456'; grant re ...