链表:链表是一个有序的列表;是以节点的方式存储的,是链式存储;其中每一个节点包含data域,next域,next域指向下一个节点;链表的各个节点不一定是连续存放的;链表分带有头节点的链表和没有头节点的链表,根据实际需求确定。

head节点:不存放具体的数据;作用就是表示单链表头。
下面的代码分别对单链表的操作。大部分代码一致,只是在前面代码上增加了新的操作。
1. 在单链表的末尾添加元素的代码实现:

package cn.xinan.link;public class SingleLinkedList {public static void main(String[] args) {//3.测试//先创建节点HeroNode hero1 = new HeroNode(1, "墨菲特", "石头人");HeroNode hero2 = new HeroNode(2, "圣枪游侠", "奥巴马");HeroNode hero3 = new HeroNode(3, "易", "剑圣");HeroNode hero4 = new HeroNode(4, "疾风剑豪", "亚索");//4.创建一个链表SingleLinked sl = new SingleLinked();//将节点加入sl.add(hero1);sl.add(hero2);sl.add(hero3);sl.add(hero4);//显示sl.list();}
}
//2.定义一个单链表来管理我们的对象
class SingleLinked{//先初始化一个头节点,头节点不动,不存放具体的数据private HeroNode head = new HeroNode(0," "," ");//添加节点到我们的单链表//思路:当不考虑编号顺序时,找到当前链表的最后节点,将最后这个节点的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;}}}//1.定义HeroNode,每一个HeroNode对象就是一个节点
class HeroNode{public int no;public String name;public String nickname;public HeroNode next;//指向下一个节点public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//为了显示方便,重写tostring方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\''+'}';}
}

2.根据上面例子的no将英雄插入到指定的位置,即按顺序插入。如果已经存在这个no,则添加失败,并给出提示。
思路分析如下:
1.首先通过辅助变量(指针)找到新添加的节点的位置,通过遍历来搞定。
2.新的节点.next= temp.next
3.将temp.next=新的节点
代码实现:

package cn.xinan.link;public class SingleLinkedList {public static void main(String[] args) {//3.测试//先创建节点HeroNode hero1 = new HeroNode(1, "墨菲特", "石头人");HeroNode hero2 = new HeroNode(2, "圣枪游侠", "奥巴马");HeroNode hero3 = new HeroNode(3, "易", "剑圣");HeroNode hero4 = new HeroNode(4, "疾风剑豪", "亚索");//4.创建一个链表SingleLinked sl = new SingleLinked();//将节点加入sl.addByOrder(hero1);sl.addByOrder(hero4);sl.addByOrder(hero3);sl.addByOrder(hero2);//显示sl.list();}
}
//2.定义一个单链表来管理我们的对象
class SingleLinked{//先初始化一个头节点,头节点不动,不存放具体的数据private HeroNode head = new HeroNode(0," "," ");//添加节点到我们的单链表//第二种方式添加,根据no添加public void addByOrder(HeroNode heroNode){//因为head节点不能动,因此我们需要一个辅助变量:temp来找到添加的位置//因为是单链表,因此我们找的temp是位于添加位置的前一个节点,否则加不进去。HeroNode temp = head;boolean flag = false;//标志添加的编号是否存在,默认为falsewhile(true){if(temp.next == null){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==true){//不能添加System.out.println("已经存在,添加失败!");}else{//可以加入heroNode.next=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;}}}
//1.定义HeroNode,每一个HeroNode对象就是一个节点
class HeroNode{public int no;public String name;public String nickname;public HeroNode next;//指向下一个节点public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//为了显示方便,重写tostring方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\''+'}';}
}

3.单链接节点的修改。根据no修改,因此编号不能改变,改变编号相当于添加。

package cn.xinan.link;
public class SingleLinkedList {public static void main(String[] args) {//3.测试//先创建节点HeroNode hero1 = new HeroNode(1, "墨菲特", "石头人");HeroNode hero2 = new HeroNode(2, "圣枪游侠", "奥巴马");HeroNode hero3 = new HeroNode(3, "易", "剑圣");HeroNode hero4 = new HeroNode(4, "疾风剑豪", "亚索");//4.创建一个链表SingleLinked sl = new SingleLinked();//将节点加入sl.addByOrder(hero1);sl.addByOrder(hero4);sl.addByOrder(hero3);sl.addByOrder(hero2);sl.addByOrder(hero2);//显示sl.list();//测试修改节点的代码HeroNode heroNode1 = new HeroNode(2, "邪恶法师", "小法");sl.update(heroNode1);//修改后显示System.out.println("*************************************");sl.list();}
}
//2.定义一个单链表来管理我们的对象
class SingleLinked{//先初始化一个头节点,头节点不动,不存放具体的数据private HeroNode head = new HeroNode(0," "," ");//添加节点到我们的单链表//第二种方式添加,根据no添加public void addByOrder(HeroNode heroNode){//因为head节点不能动,因此我们需要一个辅助变量:temp来找到添加的位置//因为是单链表,因此我们找的temp是位于添加位置的前一个节点,否则加不进去。HeroNode temp = head;boolean flag = false;//标志添加的编号是否存在,默认为falsewhile(true){if(temp.next == null){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==true){//不能添加System.out.println("已经存在这个%d,添加失败!");}else{//可以加入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;}//根据flag 判断是否找到要修改的节点if(flag==true){temp.name = newheroNode.name;temp.nickname = newheroNode.nickname;}else{//没有找到System.out.println("没有找到"+newheroNode.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 = temp.next;}}}
//1.定义HeroNode,每一个HeroNode对象就是一个节点
class HeroNode{public int no;public String name;public String nickname;public HeroNode next;//指向下一个节点public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//为了显示方便,重写tostring方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\''+'}';}
}

4.单链表节点的删除,在上面代码中增加一个删除方法。
思路分析:
1.我们先找到需要删除的这个节点的前一一个节点temp
2. temp.next = temp.next.next
3.被删除的节点,将不会有其它引用指向,会被垃圾回收机制回恻

package cn.xinan.link;
public class SingleLinkedList {public static void main(String[] args) {//3.测试//先创建节点HeroNode hero1 = new HeroNode(1, "墨菲特", "石头人");HeroNode hero2 = new HeroNode(2, "圣枪游侠", "奥巴马");HeroNode hero3 = new HeroNode(3, "易", "剑圣");HeroNode hero4 = new HeroNode(4, "疾风剑豪", "亚索");//4.创建一个链表SingleLinked sl = new SingleLinked();//将节点加入sl.addByOrder(hero1);sl.addByOrder(hero4);sl.addByOrder(hero3);sl.addByOrder(hero2);sl.addByOrder(hero2);//显示sl.list();//测试修改节点的代码HeroNode heroNode1 = new HeroNode(2, "邪恶法师", "小法");sl.update(heroNode1);//修改后显示System.out.println("*************************************");sl.list();//删除一个节点sl.del(3);System.out.println("*************************************");sl.list();}
}
//2.定义一个单链表来管理我们的对象
class SingleLinked{//先初始化一个头节点,头节点不动,不存放具体的数据private HeroNode head = new HeroNode(0," "," ");//添加节点到我们的单链表//第二种方式添加,根据no添加public void addByOrder(HeroNode heroNode){//因为head节点不能动,因此我们需要一个辅助变量:temp来找到添加的位置//因为是单链表,因此我们找的temp是位于添加位置的前一个节点,否则加不进去。HeroNode temp = head;boolean flag = false;//标志添加的编号是否存在,默认为falsewhile(true){if(temp.next == null){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==true){//不能添加System.out.println("已经存在这个%d,添加失败!");}else{//可以加入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;}//根据flag 判断是否找到要修改的节点if(flag==true){temp.name = newheroNode.name;temp.nickname = newheroNode.nickname;}else{//没有找到System.out.println("没有找到"+newheroNode.no+"的节点");}}//删除节点//因为head节点不能动,因此我们需要一个辅助变量:temp来找到待删除节点的前一个节点。//我们在比较时,是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==true){//可以删除temp.next = temp.next.next;}else{System.out.println("要删除的节点不存在!");}}//显示链表:遍历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;}}}
//1.定义HeroNode,每一个HeroNode对象就是一个节点
class HeroNode{public int no;public String name;public String nickname;public HeroNode next;//指向下一个节点public HeroNode(int no, String name, String nickname) {this.no = no;this.name = name;this.nickname = nickname;}//为了显示方便,重写tostring方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\''+'}';}
}

单链表创建及代码实现对单链表的操作相关推荐

  1. 单表置换密码java代码实现_单表替换密码

    要求: 实现单表替换密码,用键盘接收明文和密钥,屏幕答应替换表和密文,大小写敏感,输入健壮性. 实际问题: 密钥处理应该是这个程序的重点,加密和解密都没有什么要注意的地方.用key[]数组接收keyt ...

  2. 数组实现链表(C++代码+图解)

    数组实现链表(C++代码+图解) 文章目录 数组实现链表(C++代码+图解) 单链表 定义变量和数组 初始化 插入 删除 双链表 定义变量和数组 初始化 插入 删除 单链表 应用:实现邻接表(链式前向 ...

  3. 数据结构之链表及其Java实现_数据结构之链表及其Java实现

    数据的存储一般分线性存储结构和链式存储结构两种.前者是一种顺序的存储方式,在内存中用一块连续的内存空间存储数据,即逻辑上相连的物理位置相邻,比较常见的就是数组:后者是一种链式存储方式,不保证顺序性,逻 ...

  4. 数据结构-单链表(C语言代码)

    数据结构纯属新手,小白一枚,欢迎批评指正! 直接上代码OVO! 定义结构体 typedef struct Node {int data; //数据域struct Node* next; //指针域 } ...

  5. 单链表创建以及头插、尾插

    C语言高级进阶 链表是由一系列互相连接的节点组成的数据结构,这种数据结构非常有用,是实现队列和栈的基础. 学习内容 此章我们学习如何创建和使用单链表,如下代码是用来支持链表实现的结构体,Node结构体 ...

  6. 题目:代码实现判断单链表是否有环

    一.单链表环的定义: 有环的定义是,链表的尾节点指向了链接中间的某个节点.比如下图,如果单链表有环,则在遍历时,在通过结点J之后,会重新回到结点D. 题目:0.如何判断单链表里面是否有环? 算法的思想 ...

  7. C语言单链表创建(基础)

    最近在刷题重温C语言的基础知识.关于单链表的创建还有一些不懂,参考了网上的代码,做一下笔记. 1.单链表的创建与赋值 #include <stdio.h> #include <std ...

  8. 单链表的基本操作代码实现(C语言版)

    目录 前言: 单链表的基本操作 准备工作(头文件.各种宏定义以及结构体定义) 一.较简单操作 1.单链表的初始化 2.判断单链表是否为空表 3.单链表的销毁 4.单链表的清空 5.求单链表的表长 二. ...

  9. java 填充pdf_Java如何创建和填充PDF表单域(代码示例)

    本篇文章给大家带来的内容是关于Java如何创建和填充PDF表单域(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 表单域,可以按用途分为多种不同的类型,常见的有文本框.多行 ...

最新文章

  1. [转] 哈佛大学研究:一个人成为废物的九大根源
  2. Python天天美味(32) - python数据结构与算法之堆排序
  3. hibernate框架学习之数据模型-POJO
  4. 浅谈程序员的职业规划
  5. 作者:徐晔(1964-),男,博士,中国科学院云计算产业技术创新与育成中心公共安全研究院研究员、院长。...
  6. 遇到 oracle 错误 25153,EXP时,出现3113的错误,不知道怎么解决?
  7. 关于本次课堂代码的练习
  8. 多年前写的一个ASP.NET网站管理系统,到现在有些公司在用
  9. 动图:七分钟帮你理解什么是KMP算法?
  10. stata中安装meta分析模块
  11. Android6.0之AMS启动App下篇
  12. 隔行换色+删除+批量删除+排序+模糊查询+修改+添加
  13. 卡尔曼滤波算法-Matlab仿真
  14. 服务器做jsp网站教程视频,linux jsp服务器 视频教程
  15. MES系统生产派工提高注塑行业生产效率
  16. 【地理中国】百年地理大发现(全8集)内容笔记记录
  17. python fun函数输入某年某月_Python编程实现输入某年某月某日计算出这一天是该年第几天的方法...
  18. php变异测试工具,科学网—两种突变检测的matlab代码 - 张凌的博文
  19. [jzoj 4246] 【五校联考6day2】san {spfa+dfs/spfa+拓扑排序+dp}
  20. CCF TALKs 报名 | 今天,技术如何推动社会进步

热门文章

  1. html5 图片hover,关于html5:两种纯CSS方式实现hover图片popout弹出效果
  2. 解决ffmpeg获取AAC音频文件duration不准
  3. 关于win7永久禁用驱动签名问题的总结
  4. 小程序清理缓存的几种方法
  5. Time.deltaTime 的含义用法
  6. 【mysql】主键的概念作用及特点
  7. SQL的主键和外键的作用
  8. 连续两年!PingCAP 入选 Gartner 云数据库“客户之声”,获评“卓越表现者”最高分
  9. 浏览器中 F12 功能的简单介绍
  10. 【JAVA项目实战】【图书管理系统】书籍管理功能【Servlet】+【JSP】+【MySql】+【Ajax】