关于单链表中temp.next、head.next的理解
关于对单链表增删改查的详细说明。
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的理解相关推荐
- java数据结构 -链表 -获取有效节点个数,单链表中倒数k个节点
// 1.获取到单链表的节点的个数(如果有头结点,不统计头结点)public static int getLength(HeroNode head){if (head.next == null){re ...
- 删除单链表中的重复节点
删除单链表中的重复节点 一.题目描述 已知单链表L,写一算法,删除其中的重复节点.(更好的阅读体验,请访问程序员在旅途) 二.分析解答 2.1 知识点分析 本题主要考察链表的相关知识点,其中包括:单链 ...
- c语言单链表删除倒数第k个数,在单链表中删除倒数第k个节点
实现方式很多,在这里只说两种实现方式.看不懂时候,大家可以画画图,对理解为什么很有帮助. 第一种方式: 1.首先判断K值和链表是否为空,如果k<=0,或链表为空,直接返回head: 2.满足上面 ...
- 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置
题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...
- Java数据结构与算法———(10)单链表应用实例,找到单链表中倒数第K个节点
找到单链表中的倒数第K个节点,并打印输出节点.两段代码,思路都是相似的. 一.代码1 public class SingleLinkedListDemo {public static void mai ...
- 链表问题2——在单链表中删除倒数第K个节点
题目 实现一个函数,可以删除单链表中倒数第K个节点. 要求 如果链表长度为N,时间复杂度达到O(N),额外空间复杂度达到O(1). 思路 如果链表为空或者K值小于1,直接返回head即可,除此之外,从 ...
- 【 C 】在单链表中插入一个新节点的尝试(二)
在上篇博文中:[ C ]在单链表中插入一个新节点的尝试(一),我们最后提到了如果向单链表的开头(起始位置)插入一个节点,上篇博文中给出的程序显然完成不了这任务. 这篇博文中,我们将解决这个问题,给出一 ...
- 【 C 】在单链表中插入一个新节点的尝试(一)
根据<C和指针>中讲解链表的知识,记录最终写一个在单链表中插入一个新节点的函数的过程,这个分析过程十分的有趣,准备了两篇博文,用于记录这个过程. 链表是以结构体和指针为基础的,所以结构体和 ...
- 单链表——判断一个单链表中是否有环
2019独角兽企业重金招聘Python工程师标准>>> package jxau.lyx.link;/*** * @author: liyixiang* @data:2014-10- ...
- 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点
/*实验2 1. 写一个函数DeleteRange删除单链表中结点的值在low 和high之间的结点 (low和high的值是多少可自由设计).并且要在程序中验证其功能实现. (可在实验1的第3题的基 ...
最新文章
- ubuntu 12.04 php升级,在 Ubuntu 12.04 LTS 中将 PHP 从 5.3 升级到 5.5
- Ran out of input
- Linux rpm 命令参数使用详解[介绍和应用]
- Codevs 1049 棋盘染色
- CSDN开放90%页面缩放阅读博文的惊喜
- 流量劫持 —— 浮层登录框的隐患
- 搭建AD域环境时出现错误,未能为域创建GPO 出现扩展错误解决办法
- 字符串运用-密码截取
- webpack5学习与实战-(六)-babel-loader解析js文件
- 电影售票系统项目总结
- xp计算机如何共享打印机,在XP系统下怎么设置俩台电脑或多台电脑共享一个打印机?...
- android碎片化的解决方法,Android碎片化的处理
- HR不排斥的三大跳槽理由
- GNU Radio: USRP2 and N2x0 Series
- python批量下载微博贴评论图片
- i春秋第二届春秋欢乐赛登山者writeup
- 首场百度大脑开放日来袭 | 全新开放24项AI技术
- 债转股问题研究(lunwen+开题报告+外文翻译)
- 【十问评估经营理念】
- 一步一步教你写股票走势图——K线图三(添加均线)