链表介绍

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

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

单链表介绍

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

单链表应用实例

使用带head头的单向链表实现 –漫威英雄排行榜管理
完成对英雄人物的增删改查操作, 注: 删除和修改,查找

  • 第一种方法在添加英雄时,直接添加到链表的尾部
  • 第二种方式在添加英雄时,根据排名将英雄插入到指定位置 (如果有这个排名,则添加失败,并给出提示)
package linkedlist;public class SingleLinkedListDemo {public static void main(String[] args) {//测试//先创建节点HeroNode heroNode1 = new HeroNode(1, "托尼·史塔克", "钢铁侠");HeroNode heroNode2 = new HeroNode(2, "班纳博士", "绿巨人");HeroNode heroNode3 = new HeroNode(3, "斯嘉丽", "黑寡妇");HeroNode heroNode4 = new HeroNode(4, "帕克", "蜘蛛侠");HeroNode heroNode5 = new HeroNode(5, "洛基", "神");//创建链表SingleLinkedList singleLinkedList = new SingleLinkedList();//加入singleLinkedList.addByOrder(heroNode5);singleLinkedList.addByOrder(heroNode2);singleLinkedList.addByOrder(heroNode1);singleLinkedList.addByOrder(heroNode4);singleLinkedList.addByOrder(heroNode3);singleLinkedList.addByOrder(heroNode3);//显示
//      singleLinkedList.list();//测试修改节点的代码HeroNode newHeroNode = new HeroNode(2, "baihaibai", "AHAHAHA");singleLinkedList.update(newHeroNode);singleLinkedList.list();System.out.println();//删除节点singleLinkedList.del(1);singleLinkedList.del(3);singleLinkedList.list();}
}
//定义SingleLinkedList 管理我们的英雄
class SingleLinkedList{//先初始化一个头节点,头节点不要动,不存放具体的数据private HeroNode head = new HeroNode(0, "", "");//添加节点到单链表//思路,当不考虑编号顺序时//1,找到当前链表的最后节点//2,将最后这个节点的next 指向新的节点public void add(HeroNode heroNode){//因为head节点不能动,因此我们需要一个辅助遍历tempHeroNode temp = head;//遍历链表,找到最后while(true){if(temp.next == null){break;}//如果没有找到最后,将temp后移temp = temp.next;}//当退出while循环时,temp就指向了链表的最后//将最后这个节点的next 指向 新的节点temp.next = heroNode;}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 = temp.next;}}//第二种方式添加英雄时,根据排名将英雄插入到指定位置//(如果有这个排名,则添加失败,并给出提示)public void addByOrder(HeroNode heroNode){//因为头节点不能动,因此我们仍然通过一个辅助指针(变量)来帮助找到添加的位置//因为单链表,因为我们找的temp 是位于 添加位置的前一个节点,否则插入不了HeroNode temp =head;boolean flag = false;//flag 标志添加的编号是否存在,默认为falsewhile(true){if(temp.next == null){//说明temp已经在链表的最后break;}if(temp.next.no>heroNode.no){//位置找到,就在temp的后面插入break;}else if(temp.next.no==heroNode.no){flag = true;break;}temp = temp.next;//后移,遍历当前链表}//判断flag的值if(flag){System.out.println("准备插入的英雄编号已经存在"+heroNode.no);}else{//插入到链表中,temp的后面heroNode.next = temp.next;temp.next=heroNode;}}//根据newHeroNode 的no来修改即可public void update(HeroNode newHeroNode){//判断是否为空if(head.next==null){System.out.println("链表为空");return;}//找到需要修改的节点,根据no编号//定义一个辅助变量HeroNode temp = head.next;boolean flag = false;//表示是否找到该节点while(true){if(temp == null){break;//已经遍历完链表}if(temp.no==newHeroNode.no){//找到flag= true;break;}temp = temp.next;}if(flag){temp.name = newHeroNode.name;temp.nickname = newHeroNode.nickname;}else{//没有找到System.out.println("没有找到编号为"+newHeroNode.no+"节点,不能修改");}}//删除节点//思路//1 head不能动,因此我们需要一个temp辅助节点找到删除节点的前一个结点//2 说明我们在比较时,是temp.next.no 和 需要删除的节点no比较public void del(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;}//判断flagif(flag){//找到 可以删除temp.next = temp.next.next;}else{System.out.println("要删除的节点"+no+"不存在");}}}//定义HeroNode,每个HeroNode对象就是一个节点
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;}//重写toString()@Overridepublic String toString() {return "HeroNode [no=" + no + ", name=" + name + ", nickname=" + nickname + "]";}}

Java版单链表讲解相关推荐

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

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

  2. java单链表通讯录_[Java教程]用java实现单链表(菜鸟出征)

    [Java教程]用java实现单链表(菜鸟出征) 0 2016-03-24 14:00:06 package code;class Node{ Node next; int data; public ...

  3. java实现单链表就地逆置,单链表的就地逆置讲解

    { List *q; List *p = L->next; L -> next = NULL; //单链表就地逆置 while (p != NULL) { q = p -> next ...

  4. 数据结构,单链表讲解,并使用Java代码实现单链表增删改查【尾部添加,中间插入、修改节点、删除节点、展示链表】

    文章目录 单链表 什么是单链表,链式存储结构详解 链表的节点 头节点,头指针和首元节点 单链表的实现 1.尾部添加新节点 思路分析 代码实现 注意事项 2.按照编号插入新节点 思路分析 代码实现 注意 ...

  5. java单链表_(java实现)单链表

    什么是单链表 在了解单链表之前,你知道什么是链表吗?如果你不知道什么是链表,可以看看我的这篇博客 单链表是链表的其中一种基本结构.一个最简单的结点结构如图所示,它是构成单链表的基本结点结构.在结点中数 ...

  6. 链表的基本概念以及java实现单链表-循环链表-双向链表

    前言 线性结构是非常简单且常用的数据结构,而线性表则是一种非常典型的线性结构. 线性表定义 线性表的数据结构 链表 单链表 单链表的定义 单链表的插入和删除 单链表的遍历,清空,判空,获取指定结点 循 ...

  7. Java实现单链表、栈、队列三种数据结构

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:远航 cnblogs.com/yang-guang- ...

  8. 【算法数据结构Java实现】Java实现单链表

    1.背景 单链表是最基本的数据结构,仔细看了很久终于搞明白了,差不每个部分,每个链都是node的一个对象.需要两个参数定位:一个是index,表示对象的方位.另一个是node的对象. 2.代码 nod ...

  9. Java实现单链表反转操作

    单链表是一种常见的数据结构,由一个个节点通过指针方式连接而成,每个节点由两部分组成:一是数据域,用于存储节点数据.二是指针域,用于存储下一个节点的地址.在Java中定义如下: public class ...

最新文章

  1. Reveal:分析iOS UI该武器
  2. Firefox浏览器中,input输入框输入的内容在刷新网页后为何还在?
  3. 手把手教你使用C#操作SQLite数据库,新建数据库,创建表,插入,查询,删除,运算符,like(持续更新)...
  4. 插件~Nuget中包与包的依赖关系
  5. java初学者面试_Java面试的前50个问题,面向初学者和经验丰富的程序员
  6. 炸金花比牌规则java_陈陈来给你们炸金花的简易纸牌规则教学与心态指导
  7. java激光图,java-OpenCV Android跟踪激光点
  8. 用java代码实现九九乘法表
  9. Animator忽视TimeScale
  10. lol服务器维修2020,lol2020年5月29日停机维护到几点 英雄联盟维护公告是什么
  11. 全网首发:LINUX上编译ARM(AARCH)版本的OpenJDK8
  12. 原来iPhone手机还能自动清理垃圾!简单几步,就能多出几个G内存
  13. 25.专栏订阅者利用专栏技术再现无线密码破解
  14. 运用加密技术保护Java源代码
  15. 学习可爱彩色线条PS极简马克笔简笔画:饮品篇
  16. 泛泛而谈的菜鸟学习记录(三)—— unity后处理
  17. 计算机家庭组无法访问,Win7共享文件夹无法访问解决方法
  18. 看尚学堂视频Java学习笔记
  19. 利用百分位数确定考核指标的具体数字
  20. DOM事件里面的键盘事件

热门文章

  1. hadoop3.0新特性介绍
  2. Briefings in Bioinformatics | 王秀杰/裴小兵合作开发单细胞组学细胞标记基因鉴定算法COSG...
  3. 解决安装Tuxera NTFS For Mac后依旧无法写入的问题
  4. 日常生活开支记账明细_中小企业真的需要代理记账吗?
  5. linux下卸载 dev sd*下硬盘,Linux 磁盘管理(示例代码)
  6. JQuery和php方面的填空题,PHP复习题(问答题)
  7. input输入框匹配数字(带两位小数) js--金额匹配
  8. OllyDbg笔记-对标志寄存器中ZF的理解(逆向方面)
  9. Spring Boot中的Profile文件
  10. 最简单的模拟U盘病毒(Autorun.inf)