我的Java数据结构学习-4-4---双向链表
双向链表:节点
package Demo1.LinkeList; public class DoubleNode { //双向链表的节点对象 public int no;//编号 public String name;//名字 public String nickName;//昵称 public DoubleNode next;//指向下一个节点 public DoubleNode pre;//指向前一个节点 //构造器 public DoubleNode(int no, String name, String nickName) { this.no = no; this.name = name; this.nickName = nickName; } public int getNo() { return no; } public String getName() { return name; } public String getNickName() { return nickName; } public DoubleNode getNext() { return next; } @Override public String toString() { return "HeroNode{" + "no=" + no + ", name='" + name + '\'' + ", nickName='" + nickName + '\'' + ", next=" + next + '}'; } }
双向链表表对象:(增删改查)
package Demo1.LinkeList; public class DoubleLInkedList { //初始化表头 private DoubleNode head = new DoubleNode(0,"",""); public DoubleNode getHead() { return head; } //遍历双向链表 //显示链表信息【遍历打印链表】 public void prinfList() { //判断链表是不是为空 if (head.next == null) { System.out.println("链表为空::!!"); return; } //头节点不能动,同样需要辅助遍历 DoubleNode temp = head.next; while (true) { //判断链表是否是最后一个 if (temp == null) { break; } //如果不为空 System.out.println(temp); //还需要将temp后移,一定 temp = temp.next; } } //添加,默认添加到双向链表的最后 //添加节点到双向链表(顺序添加) public void addNode(DoubleNode heroNode) { //不考虑编号顺序时候,找到当前链表的最后节点,将最后的节点的next域 指向新节点 //因为head不能动,需要辅助指针(遍历链表) //System.out.println(heroNode); DoubleNode temp = head; //遍历链表,找到当前链表的最后一位 while (true) { //什么时候说明链表已经遍历到最后了,如果temp.next = null if (temp.next == null) { break; } //如果没有找到最后,temp的指针next域一致后移。 temp = temp.next; } //退出while循环时,temp一定指向链表的最后 temp.next = heroNode; heroNode.pre = temp; // prinfList(); } //修改节点的信息,根据编号来修改, public void updateNode(DoubleNode heroNode) { //判断链表是不是空的 if (head.next == null) { System.out.println("链表为空"); return; } //辅助指针 DoubleNode temp = head; boolean tag = false;//表示是否找到 //找到目标节点 while (true) { if (temp == null) { break;//已经走到了最后了,遍历完了未找到 } if (temp.no == heroNode.no) { //找到了 tag = true; break; } temp = temp.next; } if (tag) { temp.name = heroNode.name; temp.nickName = heroNode.nickName; } else { System.out.printf("未找到该【】目标节点,检查编号是否存在【%d】", heroNode.no); } } //删除一个节点 //删除节点head public void deleteNode(int nio) { if (head.next == null) { System.out.println("链表为空!!"); return; } DoubleNode temp = head.next; boolean flag = false; while (true) { if (head.next == null) { break;//走到了最后 } if (temp.no == nio) {//找到待删除的前一个结点。 flag = true; break;//找到了就退出 } temp = temp.next;//temp 后移 } if (flag) { //找了 temp.pre.next = temp.next; //防止是最后一个删除 if (temp.next!=null){ temp.next.pre = temp.pre; } } else { System.out.printf("节点不存在:【%d】\n", nio); } } }
测试双向链表:
package Demo1.LinkeList; public class DoubleLinkedListTest { public static void main(String[] args) { //双向链表的测试 System.out.println("双向链表的测试!!!"); DoubleNode heroNode1 = new DoubleNode(1, "顺悟空", "孙行者"); DoubleNode heroNode2 = new DoubleNode(2, "郭童", "白嫖当"); DoubleNode heroNode3 = new DoubleNode(3, "李四", "隔壁老李"); DoubleNode heroNode4 = new DoubleNode(4, "王五", "隔壁老五"); DoubleLInkedList list = new DoubleLInkedList(); list.addNode(heroNode1); list.addNode(heroNode2); list.addNode(heroNode4); list.addNode(heroNode3); list.prinfList(); System.out.println("============================"); //修改测试 System.out.println("修改测试!!"); DoubleNode heroNode = new DoubleNode(4, "王尼玛", "隔壁老王"); list.updateNode(heroNode); list.prinfList(); //删除 System.out.println("删除后的链表::"); list.deleteNode(2); list.prinfList(); } }
作者:隔壁老郭
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!
如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!
Java入门到入坟
万水千山总是情,打赏一分行不行,所以如果你心情还比较高兴,也是可以扫码打赏博主,哈哈哈(っ•̀ω•́)っ✎⁾⁾!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南