
java双链表的实现+模拟水浒英雄排行
发布日期:2021-05-25 17:46:09
浏览次数:12
分类:精选文章
本文共 4231 字,大约阅读时间需要 14 分钟。
双链表是数据结构中常用的链表形式,具有双向链接的特点,在循环链表中可以避免单向链表的空间浪费。接下来,我将通过具体案例,详细阐述如何实现一个能够管理水浒英雄的双链表系统。
首先,我们假设项目需要管理《水浒传》中的11个主角,他们各自有唯一的编号、姓名和外号。我们可以通过创建一个双链表,将这些节点有序地连接起来,为后续的增删和查询操作奠定基础。
双链表实现
在具体实现中,我们需要定义两个类:HeroNode和DoubleLinkedList。
HeroNode类:
public class HeroNode { public int no; // 英雄的编号 public String name; // 英雄的姓名 public String nickname; // 英雄的外号 public HeroNode next; // 指向下一个节点 public HeroNode pre; // 指向上一个节点 public HeroNode(int no, String name, String nickname) { this.no = no; this.name = name; this.nickname = nickname; } @Override public String toString() { return "HeroNode{" + "no=" + no + ", name='" + name + '\'' + ", nickname='" + nickname + '\'' + '}'; }}
DoubleLinkedList类:
public class DoubleLinkedList { private HeroNode head = new HeroNode(0, "", ""); public HeroNode getHead() { return head; } // 添加节点到双链表最后 public void add(HeroNode heroNode) { HeroNode temp = head; boolean flag = true; while (flag) { if (temp.next == null) { break; } temp = temp.next; } temp.next = heroNode; heroNode.pre = temp; } // 修改节点信息 public void update(HeroNode newHeroNode) { HeroNode temp = head.next; if (temp == null) { System.out.println("链表为空"); return; } while (true) { if (temp.no == newHeroNode.no) { temp.name = newHeroNode.name; temp.nickname = newHeroNode.nickname; break; } temp = temp.next; } } // 删除指定节点 public void del(int no) { if (head.next == null) { System.out.println("链表为空"); return; } HeroNode temp = head.next; boolean flag = false; while (!flag) { if (!temp.next) { System.out.println("已经找到了链表的最后"); break; } if (temp.no == no) { flag = true; break; } temp = temp.next; } if (flag) { temp.pre.next = temp.next; if (temp.next != null) { temp.next.pre = temp.pre; } } else { System.out.println("要删除的节点不存在"); } } // 遍历双链表 public void list() { HeroNode tmp = head.next; if (head.next == null) { throw new RuntimeException("链表为空"); } while (tmp != null) { System.out.println(tmp); tmp = tmp.next; } }}
使用说明
添加节点:通过DoubleLinkedList.add(heroNode)
方法可以将指定的HeroNode节点添加到链表的最后。例如:
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();HeroNode node1 = new HeroNode(1, "宋江", "及时雨");doubleLinkedList.add(node1);
修改节点:使用DoubleLinkedList.update(newHeroNode)
方法,可以修改链表中已有节点的信息。例如:
doubleLinkedList.update(new HeroNode(2, "花荣", "小李广"));
删除节点:使用DoubleLinkedList.del(no)
方法,根据节点的编号删除指定节点。例如:
doubleLinkedList.del(4);
遍历链表:使用DoubleLinkedList.list()
方法可以查看链表中的所有节点。例如:
doubleLinkedList.list();
项目示例
假设我们创建了以下HeroNode对象,并将它们添加到双链表中:
HeroNode heroNode1 = new HeroNode(1, "宋江", "及时雨");HeroNode heroNode2 = new HeroNode(2, "吴用", "智多星");HeroNode heroNode3 = new HeroNode(3, "林冲", "豹子头");HeroNode heroNode4 = new HeroNode(4, "李逵", "黑旋风");HeroNode heroNode5 = new HeroNode(5, "扑天大雪", "花和尚");HeroNode heroNode6 = new HeroNode(6, "陈真配", "黄袍甲");
在main
方法中,我们可以看到如何具体操作:
DoubleLinkedList doubleLinkedList = new DoubleLinkedList();doubleLinkedList.add(heroNode1);doubleLinkedList.add(heroNode2);doubleLinkedList.add(heroNode3);doubleLinkedList.add(heroNode4);doubleLinkedList.add(heroNode5);doubleLinkedList.add(heroNode6);System.out.println("修改前");doubleLinkedList.list();System.out.println("修改后");HeroNode updatedHero = new HeroNode(2, "花荣", "小李广");doubleLinkedList.update(updatedHero);doubleLinkedList.list();System.out.println("删除后");doubleLinkedList.del(4);doubleLinkedList.list();
优势与不足
优点:
- 双链表可以在O(1)时间内进行插入和删除操作。
- 节点的前后节点都清楚,可以方便地进行操作。
- 适合需要频繁插入、删除和查询的应用场景。
不足:
- 当链表非常长时,递归调用可能导致栈溢出。
- 如果要实现链表逆序遍历,可能需要额外的空间复杂度。
- 节点数量大的时候,查找特定节点的时间复杂度较高。
总结
通过上述实现,可以轻松地管理一个简单的双链表系统,适合用于学生项目或小型应用场景。接下来可以根据实际需求,优化链表的查询效率,或者实现链表的反向遍历等功能。
发表评论
最新留言
留言是一种美德,欢迎回访!
[***.207.175.100]2025年05月05日 12时43分13秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
写时复制集合 —— CopyOnWriteArrayList
2019-03-16
什么是redis的缓存雪崩, 穿透, 击穿?
2019-03-16
【转载】DSP基础--定点小数运算
2019-03-16
idea thymeleaf页面变量报错解决
2019-03-16
云游戏,打响5G第一战
2019-03-16
Docker 拉取镜像速度太慢
2019-03-16
【毕设-STM32f103寄存器版本】智能防盗系统
2019-03-16
勒索病毒Kraken2.0.7分析
2019-03-16
MySQL错误1366处理方法
2019-03-16
VxWorks 操作系统学习笔记
2019-03-16
驱动程序之_1_字符设备_13_USB设备_1_基本概念
2019-03-16
wxPython下载安装教程
2019-03-16
微机原理 6-计算机中常用的数制
2019-03-16
window系统下安装使用curl命令工具
2019-03-16
假如计算机是中国人发明的,那代码应该这么写
2019-03-16
神器 Codelf !
2019-03-16
趣图:会算法和不会算法的区别
2019-03-16
区块链会2020再次爆发,先学点DAPP压压惊,跟我一起学《区块链DApp入门实战》
2019-03-16
问题解决28:微信网页授权出现redicet_uri 参数错误
2019-03-16