前言

★ 这里是小冷的博客
✓ 优质技术好文见专栏
个人公众号,分享一些技术上的文章,以及遇到的坑
当前系列:数据结构系列
源代码 git 仓库 ‘
数据结构代码地址 代码Git 仓库地址

链表

链表(Linked List)介绍 :

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

  1. 链表是以节点的方式来存储,是链式存储
  2. 每个节点包含 data 域, next 域:指向下一个节点.
  3. 如图:发现链表的各个节点不一定是连续存储.
  4. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定

单向链表

单向链表存储节点思路图

单链表的应用实例

使用带 head 头的单向链表实现 –水浒英雄排行榜管理完成对英雄人物的增删改查操作

我们都知道 水浒传里有108位英雄吧

我们这里随便举例四个,我们想用链表的方式把他们放入我们的英雄榜里(单向链表)

新增,修改,删除的思路

添加英雄:

根据排名将英雄插入到指定位置(如果有这个排名,则添加失败,并给出提示) 思路的分析示意图:

修改节点功能

古时候,有武功的人士逗喜欢为了排名去争斗,所以我们制作英雄榜需要有更换排名的功能

排名是固定的,他的下一名也是固定的 我们要修改的只有当前占有排名的人和昵称即可

  • 先找到该节点,通过遍历,
  • temp.name = newHeroNode.name ; temp.nickname= newHeroNode.nickname

删除节点

这个功能呢可以理解为,有英雄不想争夺排名了,退休回家种田耕地享受生活了,我们需要把不需要位置的英雄占有的位置腾出来。

单向链表的增删改查

/*** @projectName: DataStructure* @package: com.hyc.DataStructure.LinkedList* @className: LinkedlistDemo* @author: 冷环渊 doomwatcher* @description: TODO* @date: 2021/12/17 16:24* @version: 1.0*/
public class LinkedlistDemo {public static void main(String[] args) {// 设置一些英雄对象HeroNode heroNode = new HeroNode(1, "宋江", "及时雨");HeroNode heroNode1 = new HeroNode(2, "卢俊义", "玉麒麟");HeroNode heroNode2 = new HeroNode(3, "吴用", "智多星");HeroNode heroNode3 = new HeroNode(4, "林冲", "豹子头");// 声明单向链表SingleLinkedlist linkedlist = new SingleLinkedlist();//加入我们的英雄节点//linkedlist.add(heroNode);//linkedlist.add(heroNode1);//linkedlist.add(heroNode2);//linkedlist.add(heroNode3);//加入按照编号linkedlist.addByOrder(heroNode);linkedlist.addByOrder(heroNode3);linkedlist.addByOrder(heroNode2);linkedlist.addByOrder(heroNode1);//输出节点信息linkedlist.List();System.out.println("更新数据后");linkedlist.updateNode(new HeroNode(1, "冷环渊", "编码大师"));//输出节点信息linkedlist.List();System.out.println("删除数据后输出");linkedlist.DeleteNode(1);linkedlist.List();}
}class SingleLinkedlist {//创建一个头结点HeroNode head = new HeroNode(0, "", "");//加入链表public void add(HeroNode node) {//头节点不能动 这里我们用一个临时指针来记录HeroNode temp = head;//遍历链表while (true) {//遍历为空就代表找了最后一个节点//不为空就后移一位继续找if (temp.next == null) {break;}//没有找到最后就后移 temptemp = temp.next;}//跳出while证明找到了最后的节点,将我们的新节点加入到最后的节点的next即可temp.next = node;}//添加节点 第二种方法public void addByOrder(HeroNode node) {/** 因为头结点不能动,我们通过指针来记录头节点来帮助找到添加的位置*因为是单链表我们找的是 Temp是位于添加位置的前一个节点,否则插入不了* *///创建一个临时变量HeroNode temp = head;//用来标识 英雄是否存在 默认为不存在(false)boolean flag = false;while (true) {//找到最后为空的位置if (temp.next == null) {break;}//如果temp的下一个no 大于 我们加入的节点,就往temp加入if (temp.next.No > node.No) {break;}//如果下一个节点等于 加入节点的No 那么就代表已经存在了节点else if (temp.next.No == node.No) {//将flag 修改为 true 代表已经存在flag = true;break;}//如果上面的都没达成就代表当前节点位置不对,向后继续遍历temp = temp.next;}//    判断 flag的值if (flag) {//如果为 true 代表节点已经存在System.out.printf("当前节点%d已经存在了,不能加入\n", node.No);} else {//    如果为false 那代表符合插入条件并且不存在与当前链表node.next = temp.next;temp.next = node;}}//修改节点信息public void updateNode(HeroNode newHeroNode) {if (head.next == null) {System.out.println("链表是空的");}//这里是头节点不能修改,我用 temp 来指向头结点HeroNode temp = head.next;// 是否找到了no的标识boolean flag = false;while (true) {//找到最后一个if (temp == null) {break;}if (temp.No == newHeroNode.No) {//如果等于 那么代表可以修改flag = true;break;}temp = temp.next;}if (flag) {//  true 修改信息temp.NickName = newHeroNode.NickName;temp.Name = newHeroNode.Name;} else {System.out.printf("没有找到 %d 这个节点", newHeroNode.No);}}//删除节点信息public void DeleteNode(int no) {HeroNode temp = head;// 用来标注 是不是可以删除boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.No == no) {flag = true;break;}temp = temp.next;}//根据flag 删除Nodeif (flag) {//找到的话就删除,这里我们只需要指向空 GC会回收temp.next = temp.next.next;} else {System.out.printf("要删除的 %d 没有找到", no);}}//遍历链表public void List() {if (head.next == null) {System.out.println("链表为空");return;}//头节点不能动 这里我们用一个临时指针来记录HeroNode temp = head.next;while (true) {//遍历为空就代表找了最后一个节点if (temp == null) {break;}//输出节点System.out.println(temp);//后移一位temp = temp.next;}}
}/*** 编写 水浒传英雄 节点*  用于存放每个英雄的属性* */
class HeroNode {//排名public int No;// 姓名public String Name;//昵称public String NickName;// 下一个是哪位好汉public HeroNode next;public HeroNode(int hNo, String hName, String hNickName) {this.No = hNo;this.Name = hName;this.NickName = hNickName;}//方便输出语句输出@Overridepublic String toString() {return "HeroNode{" +"No=" + No +", Name='" + Name + '\'' +", NickName='" + NickName + '\'' +'}';}
}

链表使用效果

总结

我们这次制作了属于自己的英雄榜(单向链表),我们收货了什么呢?

  • 节点之间联系的思路
  • 逐渐适应数据结构的一些思想
  • 动手实

【数据结构】用数据结构给水浒做了个英雄榜相关推荐

  1. 重邮2018年硕士研究生入学考试(《数据结构》802)自己做的部分答案

    重邮2018年硕士研究生入学考试(<数据结构>802)自己做的部分答案 同为考研人,分享学习内容,愿大家考研路上不孤独!一定上岸! 欢迎指正与讨论! 关注公众号:阿敏学习笔记 回复:数据结 ...

  2. 重邮2020年硕士研究生入学考试(《数据结构》802)自己做的部分答案

    重邮2020年硕士研究生入学考试(<数据结构>802)自己做的部分答案 *同为考研人,分享学习内容,愿大家考研路上不孤独!一定上岸! 欢迎指正与讨论! 关注公众号:阿敏学习笔记 回复:数据 ...

  3. 重邮2017年硕士研究生入学考试(《数据结构》802)自己做的部分答案

    重邮2017年硕士研究生入学考试(<数据结构>802)自己做的部分答案 同为考研人,分享学习内容,愿大家考研路上不孤独!一定上岸! 欢迎指正与讨论! 关注公众号:阿敏学习笔记 回复:数据结 ...

  4. 自考数据结构和数据结构导论_我跳过大学自学数据科学

    自考数据结构和数据结构导论 A few months back, I decided I wanted to learn data science. In order to do this, I sk ...

  5. mysql存储map数据结构_map数据结构

    Go map实现原理 - 恋恋美食的个人空间 - OSCHINA - 中文开源技术交流社区 https://my.oschina.net/renhc/blog/2208417 // A header ...

  6. Day739.GEO经纬度数据结构自定义数据结构 -Redis 核心技术与实战

    GEO经纬度数据结构&自定义数据结构 Hi,我是阿昌,今天学习记录的是关于GEO经纬度数据结构&自定义数据结构的内容,感谢您的关注和观看. Redis 的 5 大基本数据类型:Stri ...

  7. 数据结构 python的书推荐-为什么程序员一定要学数据结构?数据结构书单推荐~...

    原标题:为什么程序员一定要学数据结构?数据结构书单推荐~ 来自:程序员书库(ID:OpenSourceTop) 人们最初使用计算机是用来处理简单的数值计算问题,当你使用计算机来处理一个问题时,一般经过 ...

  8. python需要学数据结构吗_Python新手学习基础之数据结构-对数据结构的认知

    什么是数据结构? 数据结构是指:相互之间存在着一种或多种关系的数据元素的集合和该集合中数据元素之间的关系组成. 举个列子来理解这个数据结构: 数据可以比作是书本, 数据结构相当于书架,书存放在书架上, ...

  9. 数据结构 (一) ----- 数据结构基本概念基于数组实现线性表

    相关文章: <数据结构 (一) ----- 数据结构基本概念&基于数组实现线性表> 文章目录 数据结构基本概念 一.逻辑结构 二.存储结构 三.数据结构定义 四.数据结构的通用的几 ...

最新文章

  1. 64 安装_解决“不能安装 64 位Office,因已安装 32 位 Office 产品”问题
  2. SQL Server中查看SQL句子执行所用的时间
  3. break 与 continue
  4. c#图像处理入门(-bitmap类和图像像素值获取方法)
  5. 大剑无锋之JVM 堆内存溢出后,其他线程是否可继续工作?
  6. vaadin_Vaadin提示:延迟加载和商品标识
  7. Apache Camel 2.9发布–十大变化
  8. 企业级项目实战讲解!java的war包能直接改名么
  9. 《机器学习》周志华 习题答案9.4
  10. 团队开发冲刺1.2(2015.5.10)
  11. Mono项目的新进展
  12. 5个让你的404页面变的更加实用的技巧
  13. Linux(CentOS6.4、CentOS6.3)下安装、配置PostgreSQL9.2
  14. Python爬虫项目:爬虫爬取正则分析糗百数据
  15. 卡内基梅隆计算机硕士录取案例,大神offer | 恭喜再来人学员录取卡耐基梅隆大学-机器学习硕士!...
  16. JS利用for多重循环制作9*9乘法表
  17. 为什么录像都是用.avi而不是.mp4?
  18. Nodejs+express 代码工程打包 PKG
  19. java设计模式adapter,java设计模式-适配器模式(Adapter)
  20. BUG处理:javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path buil

热门文章

  1. 【CET4四级英语】【单词】英语四级高频词汇(4)
  2. 360 safe3.php源码,360提供的Php防注入代码
  3. soap协议中的soap结构体
  4. AJAX框架衣柜门款式推拉,诗尼曼三种不同风格衣柜推拉门 不同的推拉感受
  5. 华为OD机试 - 去除多余空格(Java JS Python)
  6. Flutter(十八)——支付宝咻一咻动画实践
  7. win2012关闭计算机,一招教你彻底关闭windows server2012 R2中的自动更新服务
  8. python中的编码方式
  9. 【首页】vue、element-ui首页界面框架
  10. 领域驱动核心概念总结