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)时间内进行插入和删除操作。
    • 节点的前后节点都清楚,可以方便地进行操作。
    • 适合需要频繁插入、删除和查询的应用场景。
    • 不足

    • 当链表非常长时,递归调用可能导致栈溢出。
    • 如果要实现链表逆序遍历,可能需要额外的空间复杂度。
    • 节点数量大的时候,查找特定节点的时间复杂度较高。

    总结

    通过上述实现,可以轻松地管理一个简单的双链表系统,适合用于学生项目或小型应用场景。接下来可以根据实际需求,优化链表的查询效率,或者实现链表的反向遍历等功能。

    上一篇:单向循环链表解决(详细思路+图解)约瑟夫问题
    下一篇:java单链表实现+模拟水浒英雄排名

    发表评论

    最新留言

    留言是一种美德,欢迎回访!
    [***.207.175.100]2025年05月05日 12时43分13秒