关于对单链表增删改查的详细说明。
public class SingleLinkedListDemo {public static void main(String[] args) {//进行测试//先创建节点HeroNode hero1 = new HeroNode(1, "宋江", "及时雨");HeroNode hero2 = new HeroNode(2, "卢俊义", "玉麒麟");HeroNode hero3 = new HeroNode(4, "吴用", "智多星");HeroNode hero4 = new HeroNode(3, "林冲", "豹子头");//创建链表SingleLinkedList singleLinkedList = new SingleLinkedList();//测试需求一:加入add
//        singleLinkedList.add(hero1);
//        singleLinkedList.add(hero4);
//        singleLinkedList.add(hero2);
//        singleLinkedList.add(hero3);//需求二:根据排名将英雄插入到指定为位置,排序加入addByOrdersingleLinkedList.addByOrder(hero1);singleLinkedList.addByOrder(hero4);singleLinkedList.addByOrder(hero2);singleLinkedList.addByOrder(hero3);//需求三:修改节点的信息, 根据no编号来修改,即no编号不能改.(简单)HeroNode newHeroNode = new HeroNode(2, "小卢", "玉麒麟~~");singleLinkedList.update(newHeroNode);//需求四:删除节点singleLinkedList.del(1);//显示链表singleLinkedList.list();}
}//定义SingleLinkedList 管理我们的英雄
class SingleLinkedList {//先初始化一个头节点,头节点不动,不存放具体数据private HeroNode head = new HeroNode(0, "", "");//返回头节点public HeroNode getHead() {return head;}//需求一:添加节点到单向链表/*思路:当不考虑编号顺序时候.1.找到当前链表的最后节点,使用temp当指针2.将这个最后节点的next指向新的节点*/public void add(HeroNode heroNode) {HeroNode temp = head;while (true) {if (temp.next == null) {break;}temp = temp.next;}temp.next = heroNode;}//需求二:根据排名将英雄插入到指定为位置/*思路:1.确定新添加的节点的位置,通过遍历来解决2.新节点.next = temp.next(2和3反过来行不行,会导致新节点自我死循环)3.temp.next = 新节点*/public void addByOrder(HeroNode heroNode) {HeroNode temp = head;boolean flag = false;//flag标志添加的编号是否存在,默认为false//  1.通过while(true)确定新添加的节点的位置,通过遍历来解决while (true) {if (temp.next == null) {//情况一:temp已经再在链表的最后break;}if (temp.next.no > heroNode.no) {//情况二:位置找到break;} else if (temp.next.no == heroNode.no) {//情况三:说明希望添加的heroNode的编号已然存在flag = true;//改变flag值break;}temp = temp.next;//temp后移}if (flag) {System.out.printf("准备插入的英雄的编号%d已经存在了,不能加入\n", heroNode.no);} else {heroNode.next = temp.next;temp.next = heroNode;}}//需求三:修改节点的信息, 根据no编号来修改,即no编号不能改.(简单)/*思路:1.确定需要修改节点的位置,通过遍历来解决2.temp.name = newHeroNode.name;3.temp.nickname == newHeroNode.nickname;*/public void update(HeroNode newHeroNode) {if (head.next == null) {System.out.println("链表为空");return;}HeroNode temp = head.next;boolean flag = false;//flag为true时,表示找到该节点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.printf("没有找到 编号 %d 的节点,不能修改\n", newHeroNode.no);}}//需求四:删除节点/*思路:1.确定需要删除节点的位置,通过遍历来解决(通过 no来确定删除节点的位置)2.进行删除temp.next = temp.next.next;*/public void del(int no) {HeroNode temp = head;boolean flag = false;while (true) {if (temp.next == null) {break;}if (temp.next.no == no) {//找到了需要删除的节点,即temp的下一个节点flag = true;break;}temp = temp.next;}if (flag) {temp.next = temp.next.next;//直接将temp.next指向temp.next.next,实现删除} else {System.out.printf("要删除的 %d 节点不存在\n", no);}}//显示链表(while(true)遍历实现)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;}}}//定义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;}@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'';}
}
PS:问:初学者往往会对head.next困惑,认为next从头至尾都没有赋值,为什么XX.next就一定指向下一个节点呢??
答:我们拿出一段代码进行说明:
//需求一:添加节点到单向链表
/*思路:当不考虑编号顺序时候.
1.找到当前链表的最后节点,使用temp当指针
2.将这个最后节点的next指向新的节点*/
public void add(HeroNode heroNode) {HeroNode temp = head;//①定义了一个temp,指向了头节点while (true) {if (temp.next == null) {//②add(hero1)的时候,next还没有定义,所以temp.next为默认值
//即为null,遇到break跳出循环。break;}temp = temp.next;}temp.next = heroNode;//③跳出循环后,temp.next就指向了heroNode,即指向了hero1。
//这里就对next完成了赋值,第二次add(hero2)时候,见下:public void add(HeroNode heroNode) {HeroNode temp = head;while (true) {if (temp.next == null) {//temp.next=hero1break;}temp = temp.next;//temp由头节点指向了hero1}temp.next = heroNode;temp.next指向了hero2,以后的每一次add都往复如此。}}

在测试代码中,singleLinkedList.add(hero1)表示是加入第一个节点hero1,我们来看看如何加入的,见代码注释①②③。

关于单链表中temp.next、head.next的理解相关推荐

  1. java数据结构 -链表 -获取有效节点个数,单链表中倒数k个节点

    // 1.获取到单链表的节点的个数(如果有头结点,不统计头结点)public static int getLength(HeroNode head){if (head.next == null){re ...

  2. 删除单链表中的重复节点

    删除单链表中的重复节点 一.题目描述 已知单链表L,写一算法,删除其中的重复节点.(更好的阅读体验,请访问程序员在旅途) 二.分析解答 2.1 知识点分析 本题主要考察链表的相关知识点,其中包括:单链 ...

  3. c语言单链表删除倒数第k个数,在单链表中删除倒数第k个节点

    实现方式很多,在这里只说两种实现方式.看不懂时候,大家可以画画图,对理解为什么很有帮助. 第一种方式: 1.首先判断K值和链表是否为空,如果k<=0,或链表为空,直接返回head: 2.满足上面 ...

  4. 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...

  5. Java数据结构与算法———(10)单链表应用实例,找到单链表中倒数第K个节点

    找到单链表中的倒数第K个节点,并打印输出节点.两段代码,思路都是相似的. 一.代码1 public class SingleLinkedListDemo {public static void mai ...

  6. 链表问题2——在单链表中删除倒数第K个节点

    题目 实现一个函数,可以删除单链表中倒数第K个节点. 要求 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 思路 如果链表为空或者K值小于1,直接返回head即可,除此之外,从 ...

  7. 【 C 】在单链表中插入一个新节点的尝试(二)

    在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...

  8. 【 C 】在单链表中插入一个新节点的尝试(一)

    根据<C和指针>中讲解链表的知识,记录最终写一个在单链表中插入一个新节点的函数的过程,这个分析过程十分的有趣,准备了两篇博文,用于记录这个过程. 链表是以结构体和指针为基础的,所以结构体和 ...

  9. 单链表——判断一个单链表中是否有环

    2019独角兽企业重金招聘Python工程师标准>>> package jxau.lyx.link;/*** * @author: liyixiang* @data:2014-10- ...

  10. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点

    /*实验2 1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点 (low和high的值是多少可自由设计).并且要在程序中验证其功能实现. (可在实验1的第3题的基 ...

最新文章

  1. ubuntu 12.04 php升级,在 Ubuntu 12.04 LTS 中将 PHP 从 5.3 升级到 5.5
  2. Ran out of input
  3. Linux rpm 命令参数使用详解[介绍和应用]
  4. Codevs 1049 棋盘染色
  5. CSDN开放90%页面缩放阅读博文的惊喜
  6. 流量劫持 —— 浮层登录框的隐患
  7. 搭建AD域环境时出现错误,未能为域创建GPO 出现扩展错误解决办法
  8. 字符串运用-密码截取
  9. webpack5学习与实战-(六)-babel-loader解析js文件
  10. 电影售票系统项目总结
  11. xp计算机如何共享打印机,在XP系统下怎么设置俩台电脑或多台电脑共享一个打印机?...
  12. android碎片化的解决方法,Android碎片化的处理
  13. HR不排斥的三大跳槽理由
  14. GNU Radio: USRP2 and N2x0 Series
  15. python批量下载微博贴评论图片
  16. i春秋第二届春秋欢乐赛登山者writeup
  17. 首场百度大脑开放日来袭 | 全新开放24项AI技术
  18. 债转股问题研究(lunwen+开题报告+外文翻译)
  19. 【十问评估经营理念】
  20. 一步一步教你写股票走势图——K线图三(添加均线)

热门文章

  1. 文本摘要——综述报告
  2. Data Recovery Strategy Determines Backup Strategy【每日一译】--2012-11-11
  3. 【Nginx 源码学习】平滑重启,源码追踪
  4. 今日睡眠质量记录70分
  5. 右下角弹窗 html 怎么写,右下角弹窗广告.html
  6. 利用宏合并一个工作薄下的多张表格方法
  7. windows下iexplore的命令行参数
  8. java替换字符串_java string中的替换字符串
  9. scala 定义空list_scala-03-list操作
  10. 向量 数量积vs向量积