青海公路建设信息服务网站,网站不备案可以做淘宝客吗,一级建造师报考条件2022考试时间,网站建设的报价单下面实现一个例子来进行学习
1#xff09;介绍
单链表的逻辑结构 在内存中的实际结构 具体创建示意图#xff1a; 2#xff09;代码实现
例子 1。第一个程序在添加的时候并没有按照序号排序#xff0c;如果在添加的时候把位置改变输出的时候序号会改变
package DataStr…下面实现一个例子来进行学习
1介绍
单链表的逻辑结构 在内存中的实际结构 具体创建示意图 2代码实现
例子 1。第一个程序在添加的时候并没有按照序号排序如果在添加的时候把位置改变输出的时候序号会改变
package DataStructures.LinkedList;public class SingleLinedListDemo {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 linkedList new SingleLinkedList();//加入linkedList.add(hero1);linkedList.add(hero2);linkedList.add(hero3);linkedList.add(hero4);//显示linkedList.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){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;}//为了显示方便重写toStringOverridepublic String toString() {return HeroNode{ no no , name name \ , nickName nickName \ };}
}2。第二个程序下面的代码会进行排序这里排序我感觉和JAVA-API的实现ComparaTo类似
下面是思路分析 和上面程序比新添加了一个addByOrder()方法
这样就可以在内存中实现数据以链表形式生成并根据序号排序速度快效率高。
package DataStructures.LinkedList;public class SingleLinedListDemo {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 linkedList new SingleLinkedList();//加入(按照加入的顺序)
// linkedList.add(hero1);
// linkedList.add(hero2);
// linkedList.add(hero3);
// linkedList.add(hero4);//加入按照no序号排序linkedList.addByOrder(hero1);linkedList.addByOrder(hero4);linkedList.addByOrder(hero2);linkedList.addByOrder(hero3);linkedList.addByOrder(hero3);//显示linkedList.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 addByOrder(HeroNode heroNode){//因为头结点不能动我们仍然需要通过一个辅助变量来帮助找到添加的位置//因为单链表因此我们找的temp是位于添加位置的前一个节点否则插入不了,因为前一个节点next才可以找到新插入的HeroNode temp head;boolean flag false;while (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.printf(人物编号%d 已经存在不能添加\n,heroNode.no);} else {//插入到链表中temp后heroNode.next temp.next; //连接新的节点的next和下一个的datatemp.next heroNode; //连接上一个节点的next和新节点的数据}}public void list(){//先判断链表是否为空if (head.next null){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;}//为了显示方便重写toStringOverridepublic String toString() {return HeroNode{ no no , name name \ , nickName nickName \ };}
}
下面进行修改节点信息根据nono不能变在SingleLinkedList中添加方法
//修改节点信息根据no来修改no不能改变public void updata(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){temp.name newHeroNode.name;temp.nickName newHeroNode.nickName;}else {//没找到System.out.printf(没有找到编号%d 的节点不能修改,newHeroNode.no);}}测试代码 //显示(修改前)System.out.println(显示(修改前));linkedList.list();//测试修改节点的代码HeroNode hero5 new HeroNode(2, chun, chunchun);linkedList.updata(hero5);//显示(修改后)System.out.println(显示(修改后));linkedList.list();根据no来删除节点遍历链表找到no节点的前一个位置让no前一个位置的next指向no的后一个位置的数据 //删除节点//思路// 1.先找到需要删除的这个节点的前一个节点// 2.temp.next temp.next.next// 被删除的节点没有引用指向会被GC回收public void delete(int no){if (head.next null){System.out.println(链表为空不能删除);return;}//找到需要修改的节点根据no编号//定义一个辅助变量HeroNode temp head;boolean flag false;//标记是否找到待删除的节点while (true){if (temp.next null){ //节点遍历完毕break;}if (temp.next.no no){//找到节点noflag true;break;}temp temp.next; //temp后移}if (flag){//找到notemp.next temp.next.next;}else {System.out.printf(链表里没有no为%d 的节点\n,no);}}测试代码 //删除节点linkedList.delete(2);System.out.println(显示删除后);linkedList.list();linkedList.delete(2);System.out.println(显示删除后);linkedList.list();