您的位置:首页 > 文旅 > 旅游 > 【数据结构】单链表的增删改查

【数据结构】单链表的增删改查

2024/10/6 18:22:30 来源:https://blog.csdn.net/2302_78914800/article/details/140684911  浏览:    关键词:【数据结构】单链表的增删改查
介绍

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

①链表以节点的方式进行存储,是链式存储的

②每个节点包含 data 域、next 域:指向下一节点

③链表的各个节点不一定是连续存放的

④链表分为有头节点的链表和没有头节点的链表 

head节点

1.不存放具体数据

2.作用就是表示单链表头

一、将英雄直接添加到链表尾部
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, "唐三藏", "唐僧");//创建一个链表SingleLinkedList singleLinkedList = new SingleLinkedList();//加入singleLinkedList.add(heroNode1);singleLinkedList.add(heroNode2);singleLinkedList.add(heroNode3);singleLinkedList.add(heroNode4);//显示一把singleLinkedList.list();}
}//定义StringLinkedList 管理我们的英雄
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.next;}//当退出while循环时,temp就指向了链表的最后temp.next = heroNode;}//显示链表【遍历】public void list() {//判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}//因为头节点不能动,因此我们需要一个辅助节点来遍历HeroNode temp = head.next;while (true) {//输出节点信息System.out.println(temp);//判断是否到链表最后if (temp.next == null) {break;}//将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;}//为了显示方便,我们重写toString方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}
二、将英雄按照排名插入到链表中

1.首先找到新添加的节点的位置,通过辅助指针完成

2.新节点.next = temp.next

3.temp.next = 新节点

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, "唐三藏", "唐僧");//创建一个链表SingleLinkedList singleLinkedList = new SingleLinkedList();//加入
//        singleLinkedList.add(heroNode1);
//        singleLinkedList.add(heroNode2);
//        singleLinkedList.add(heroNode3);
//        singleLinkedList.add(heroNode4);//按照编号的顺序加入singleLinkedList.addByOrder(heroNode4);singleLinkedList.addByOrder(heroNode1);singleLinkedList.addByOrder(heroNode3);singleLinkedList.addByOrder(heroNode2);//显示一把singleLinkedList.list();}
}//定义StringLinkedList 管理我们的英雄
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.next;}//当退出while循环时,temp就指向了链表的最后temp.next = heroNode;}//第二种添加英雄的方式/*根据排名将英雄插入到指定位置如果有这个排名,则添加失败,并给出提示*/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) {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;temp.next = heroNode;}}//显示链表【遍历】public void list() {//判断链表是否为空if (head.next == null) {System.out.println("链表为空");return;}//因为头节点不能动,因此我们需要一个辅助节点来遍历HeroNode temp = head.next;while (true) {//输出节点信息System.out.println(temp);//判断是否到链表最后if (temp.next == null) {break;}//将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;}//为了显示方便,我们重写toString方法@Overridepublic String toString() {return "HeroNode{" +"no=" + no +", name='" + name + '\'' +", nickname='" + nickname + '\'' +'}';}
}
 三、修改节点的信息
//修改节点的信息,根据编号修改,即编号不能改public void update(HeroNode newHeroNode) {//判断是否空if (head.next == null) {System.out.println("链表为空");return;}//根据编号,找到需要修改的节点//定义一个辅助变量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的节点,不能修改\n", newHeroNode.no);}}
四、删除节点

从单链表中删除一个节点的思路

1.我们先找到需要删除的节点的前一个节点 temp

2.temp.next = temp.next,next

3.被删除的节点将不会有其他的引用指向,会被垃圾回收机制回收

//删除节点/*思路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 == true) {  //找到了temp.next = temp.next.next;} else {  //没找到System.out.printf("编号为%d的节点不存在", no);}}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com