单链表介绍

  • 链表是有序的列表,但是它在内存中的实际结构如下图:
  • 链表是以节点的方式来存储的,是链式存储,链表的各个节点不一定是连续存储(如上图)
  • 链表分带头节点的链表和没有头节点的链表,根据实际需求来确定
  • 带头结点单链表的逻辑结构如下图所示:

应用实例

使用带头结点单链表实现水浒英雄排行榜完成对英雄人物的增删改查操作,其中包括根据编号大小插入到指定位置。

package ds.sq.linkedlist;public class SingleLinkedListDemo {public static void main(String[] args){//主函数:初始化四位英雄的信息HeroNode hero1=new HeroNode(1,"宋江","及时雨");HeroNode hero2=new HeroNode(2,"卢俊义","玉麒麟");HeroNode hero3=new HeroNode(3,"吴用","智多星");HeroNode hero4=new HeroNode(4,"林冲","豹子头");SingleLinkedList singleLinkedList=new SingleLinkedList();//1.测试:【添加add】
//        singleLinkedList.add(hero1);
//        singleLinkedList.add(hero2);
//        singleLinkedList.add(hero3);
//        singleLinkedList.add(hero4);//【显示list】System.out.println("【测试1】初始化链表为空时:");singleLinkedList.list();//1.测试:【根据排名添加addByOrder】添加顺序1、3、2、4singleLinkedList.addByOrder(hero1);singleLinkedList.addByOrder(hero3);singleLinkedList.addByOrder(hero2);singleLinkedList.addByOrder(hero4);System.out.println("【测试2】根据排名添加:");singleLinkedList.list();//2.测试:【修改】   System.out.println("【测试3】修改:");HeroNode mHero1=new HeroNode(1,"Song Jiang","Ji Shiyu");singleLinkedList.modify(mHero1);singleLinkedList.list();//3.测试:【删除】System.out.println("【测试4】删除:");singleLinkedList.del(5);singleLinkedList.list();}
}class SingleLinkedList{private HeroNode head=new HeroNode(0,"","");//当不考虑编号的顺序时// 1、找到当前链表的最后节点// 2、将最后这个节点的next域指向新的节点public void add(HeroNode heroNode){//因为head节点不能动 因此我们需要一个辅助变量HeroNode tHeroNode=head;while(true){if(tHeroNode.next==null){tHeroNode.next=heroNode;break;}// 如果没有找到就将t后移tHeroNode=tHeroNode.next;}}//考虑编号的顺序时public void addByOrder(HeroNode heroNode){//因为头结点不能动,我们仍然通过一个辅助指针,帮助找到添加的位置//找的temp位于添加位置的前一个结点,否则加入不了HeroNode tHeroNode=head;boolean flag=false;while(true){if(tHeroNode.next==null){//说明链表已经到最后break;}if( tHeroNode.next.no>heroNode.no){break;}else if(tHeroNode.next.no==heroNode.no){flag=true;break;}tHeroNode=tHeroNode.next;//后移}if(flag==true){//不可以添加System.out.printf("准备插入的英雄的编号 %d 已经存在\n",heroNode.no);}else{heroNode.next=tHeroNode.next;tHeroNode.next=heroNode;}}public void list(){if(head.next==null){System.out.println("链表为空");return;}HeroNode tHeroNode=head.next;   //这里直接指向第一个有编号的节点,避免程序输出头结点;while(true){//是否到链表最后if(tHeroNode==null){break;}//输出节点信息System.out.println(tHeroNode);tHeroNode=tHeroNode.next;}}public void modify(HeroNode heroNode){HeroNode tHeroNode=head;boolean flag=false;while(true) {if (head.next==null||tHeroNode==null) {break;}if(tHeroNode.no==heroNode.no){flag=true;break;}else{tHeroNode=tHeroNode.next;}}if(flag){tHeroNode.nickname=heroNode.nickname;tHeroNode.name=heroNode.name;}else{System.out.println("未找到相关人物,无法修改。");}}public void del(int no){HeroNode tHeroNode=head;boolean flag=false;while(true){if(head.next==null){break;}if(tHeroNode.next==null){//这里是temp节点的下一个节点为空就需要跳出,不是tHeroNode==null;//因为在这里我们需要得到的是【待删除节点的前一个节点的位置】;//如果这里事先不做判断,当没有可删节点时,下面一句会报错//总结:所有遍历的判断,没有找到的判断句和找到时候的判断变量要保持一致;否则可能报错//比如这里的tHeroNode.next==null和tHeroNode.next.no==no;主体判断变量都是tHeroNode.nextbreak;}if(tHeroNode.next.no==no){flag=true;break;}tHeroNode=tHeroNode.next;}if(flag){tHeroNode.next=tHeroNode.next.next;}else{System.out.printf("未找到no=[%d]的节点",no);}}
}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;}public String toString(){return "HeroNode [no"+no+"]name["+name+"]nickname["+nickname+"]";}
}
  • 删除3号英雄:

  • 删除5号英雄:

Java数据结构:单链表Single Linked List基础笔记相关推荐

  1. 数据结构--单链表single linked list数据结构C++实现

    2018年2月开始学习的 C++ Primer,到今天2019年3月已经整整一年了,非常感谢在一起交流的小伙伴,是你们的无私帮助和分享使得我能跨越很多技术的坑,感谢你们!期待我们2019年一起拿下&l ...

  2. 数据结构--单链表single linked list(无表头哨兵)重写

    针对上次写的单链表中不足的地方进行修改: 1.构造函数需要让用户输入(bad) 2.函数功能不单一,既操作链表,还打印输出(bad) 代码链接(包含无头\有头单链表.循环单链表.双链表.循环双链表) ...

  3. java数据结构 - 单链表(腾讯面试题实现单链表反转)

    直接上实现代码 //单链表的反转public static void reverseList(HeroNode head){//如果当前链表为空,或只有一个节点,无需反转if (head.next = ...

  4. 数据结构 - 单链表(Linked List)实现在内存中实现数据以链表形式生成并根据序号排序

    下面实现一个例子来进行学习 1)介绍 单链表的逻辑结构 在内存中的实际结构 具体创建示意图: 2)代码实现 例子 1.第一个程序在添加的时候并没有按照序号排序,如果在添加的时候把位置改变输出的时候序号 ...

  5. 用c语言描述单链表的数据类型,数据结构—单链表(类C语言描述)

    单链表 1.链接存储方法 链接方式存储的线性表简称为链表(Linked List).     链表的具体存储表示为: ① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不 ...

  6. java实现单链表的建立(头插法和尾插法)

    单链表 单链表(Single Linked List): 单链表是一种链式存取的数据结构,用一组地址任意(可能连续,也可能不连续)的存储单元存放线性表中的数据元素. 链表中的数据是以结点来表示的,每个 ...

  7. Java数据结构之链表(单链表)

    文章目录 一.链表 概念 结构 二.无头单链表 图解 代码实现 特点 三.带头单链表 为何引入带头单链表 代码实现 注意 提示:以下是本篇文章正文内容,Java系列学习将会持续更新 一.链表 概念 链 ...

  8. java实现单链表常见操作,java面试题,java初级笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 一. ...

  9. 20175330 数据结构-单链表(选做)

    要求 参见附件,补充MyList.java的内容,提交运行结果截图(全屏) 课下推送代码到码云 ``` public class MyList {     public static void mai ...

  10. php链表和联表的区别,PHP_浅谈PHP链表数据结构(单链表),链表:是一个有序的列表,但 - phpStudy...

    浅谈PHP链表数据结构(单链表) 链表:是一个有序的列表,但是它在内存中是分散存储的,使用链表可以解决类似约瑟夫问题,排序问题,搜索问题,广义表 单向链表,双向链表,环形链表 PHP的底层是C,当一个 ...

最新文章

  1. 分享一波 ZooKeeper 面试题
  2. HTML5 WebAudioAPI简介(一)
  3. .Net IOC框架入门之三 Autofac
  4. 2.3 线性变换引入
  5. (Z)使用SignalTAP II为了避免某些节点被弄丢, 必须要关闭的编译选项
  6. 013.Zabbix的Items(监控项)
  7. grep 命令的 12 个实例
  8. 数据结构:排序算法之交换排序(冒泡排序、快速排序)
  9. 字体海报设计灵感|这海报的字体够别致,脑洞够大!
  10. 人工智能与物联网安全:以子之矛,攻子之盾
  11. nbu备份脚本 linux,netbackup备份教程详解
  12. python打印pdf文件_3条指令教会你用python创建中文pdf文件,适合批量打印,附送源码-pdf文件不能打印...
  13. python运用maya_适用于maya和其他3d应用程序的python版本
  14. js判断字符串字符数(汉字算两个)
  15. golang 定时任务处理
  16. python爬虫 京东关键词搜索商品及具体参数和评论
  17. python encoding是什么_python中encoding什么意思
  18. idea中打开maven的setting.xml
  19. SCI、EI论文检索,引用格式
  20. 0x01 - 前期信息收集

热门文章

  1. http://www.guokr.com/blog/475765/
  2. .NET Interop.SHDocVw和MSHTML引用如何操作
  3. Build Apache Module
  4. IOS 学习笔记 2015-04-10 OC-常用常量
  5. html入门的一些东西
  6. mysql使用多个索引_mysql索引合并:一条sql可以使用多个索引
  7. linux内核数据链路层,基于Linux数据链路层的MPI集群通信机制的设计与实现-嵌入式系统-与非网...
  8. Java基础,无需使用复杂语句,实现输出0-130之间的数字,每行显示7个数字。
  9. oracle数据库sga用途_oracle数据库的SGA和PGA,及分配指导
  10. 如果让你写一个消息队列,该如何进行架构设计啊?说一下你的思路