Java数据结构--链表(三)

简介: Java数据结构--链表(三)

双向链表的添加节点


image.png

image.png


双向链表删除节点



image.png


package com.caq.linkedlist;/** * 双向链表的增删改查 * * @Date 2021/12/10 12:24 * @Version 1.0 */public class DoubleLinkedDemo {    public static void main(String[] args) {        HeroNode2 head = new HeroNode2(2, "", "");        //双向链表的测试        HeroNode2 hero1 = new HeroNode2(1, "宋江", "及时雨");        HeroNode2 hero2 = new HeroNode2(2, "卢俊义", "玉麒麟");        HeroNode2 hero3 = new HeroNode2(3, "吴用", "智多星");        DoubleLinkedList doubleLinkedList = new DoubleLinkedList();        doubleLinkedList.add(hero1);        doubleLinkedList.add(hero2);        doubleLinkedList.add(hero3);        doubleLinkedList.list();        //修改        HeroNode2 newHero = new HeroNode2(2, "BB", "CC");        doubleLinkedList.update(newHero);        System.out.println("修改后的情况为");        doubleLinkedList.list();    }}class DoubleLinkedList {    //生一个头结点    private HeroNode2 head = new HeroNode2(0, "", "");    //得到头结点    public HeroNode2 getHead() {        return head;    }    //显示链表[遍历]    public void list() {        if (head.next == null) {            System.out.println("链表为空");            return;        }        HeroNode2 temp = head.next;        while (true) {            if (temp == null) {                break;            }            System.out.println(temp);            temp = temp.next;        }    }    //添加节点到单向链表    public void add(HeroNode2 heroNode) {        HeroNode2 temp = head;        //遍历链表,找到最后        while (true) {            //找到链表的最后            if (temp.next == null) {                break;            }            //如果没有找到最后,就讲temp后移            temp = temp.next;        }        //当退出while循环时,temp就指向了链表的最后        //形成一个双向链表        temp.next = heroNode;        heroNode.pre = temp;    }    //修改思路和单链表一样    public void update1(HeroNode2 heroNode2) {        boolean flag = false;        HeroNode2 temp = head.next;        while (true) {            //寻找要修改的结点            if (temp == null) {                break;            } else if (temp.number == heroNode2.number) {                flag = true;                break;            }            temp = temp.next;        }        if (flag) {            temp.next = heroNode2.next;            temp.pre = heroNode2.pre;        }    }    public void update(HeroNode2 heroNode) {        HeroNode2 temp = head.next;        boolean flag = false;        while (true) {            if (temp.next == null) {                break;            }            //匹配节点            if (temp.number == heroNode.number) {                flag = true;                break;            }            temp = temp.next;        }        if (flag) {            temp.name = heroNode.name;            temp.nextname = heroNode.nextname;        } else {            System.out.println("没有找到编号为" + heroNode.number + "");        }    }    //删除节点    //双向链表找到后可以自我删除不必借助其他结点    public void delete(int number) {        HeroNode2 temp = head.next;        boolean flag = false;   //是否找到        while (true) {            if (temp.next == null) {    //到最后了                break;            }            if (temp.number == number) {                flag = true;                break;            }            temp = temp.next;   //temp后移,遍历链表        }        //被删除的结点,不会有其他引用指向,会被垃圾回收机制回收        //这和c语言一模一样啊!        if (flag) {//            temp.next = temp.next.next;            temp.pre.next = temp.next;            //如果是最后一个节点,不需要执行下面这句话,否则会出现空指针            if (temp.next != null) {                temp.next.pre = temp.pre;            } else {                System.out.println("没有找到要删除的结点" + number + "!");            }        }    }}class HeroNode2 {    public int number;    public String name;    public String nextname;    public HeroNode2 next; //指向下一个节点    public HeroNode2 pre;//指向前一个结点,默认为null    public HeroNode2(int number, String name, String nextname) {        this.number = number;        this.name = name;        this.nextname = nextname;    }    @Override    public String toString() {        return "HeroNode2{" +                "number=" + number +                ", name='" + name + '\'' +                ", nextname='" + nextname + '\'' +                '}';    }}
1
输出结果为:
HeroNode2{number=1, name='宋江', nextname='及时雨'}HeroNode2{number=2, name='卢俊义', nextname='玉麒麟'}HeroNode2{number=3, name='吴用', nextname='智多星'}修改后的情况为HeroNode2{number=1, name='宋江', nextname='及时雨'}HeroNode2{number=2, name='BB', nextname='CC'}HeroNode2{number=3, name='吴用', nextname='智多星'}
1
循环链表
将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相接的单链表称为单循环链表,简称循环链表( circuar linkedlist)。
其实循环链表和单链表的主要差异就在于循环的判断条件上,原来是判断p->next是否为空,现在则是p-> next不等于头结点,则循环未结束。


[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XcoFO05D-1639655004233)(C:/Users/Jack/AppData/Roaming/Typora/typora-user-images/image-20211216110539595.png)]


约瑟夫环问题



约瑟夫问题是个有名的问题:N个人围成一圈,**从第一个开始报数,第M个将被杀掉,最后剩下一个,其余人都将被杀掉。**例如N=6,M=5,被杀掉的顺序是:5,4,6,2,3。


环行链表的思路分析:

构建一个单向的环形链表思路

1.先创建第一个节点,让first指向该节点,并形成环形

2.后面当我们每创建一个新的节点,就把该节点,加入到已有的环形链表中即可.


遍历环形链表



1.先让一个辅助指针(变量) curBoy,指向first节点

2.然后通过一个while循环遍历该环形链表即可curBoy.next == first结束


起始


image.png


curBoy.next -> newNode


image.png


boy.next -> first


image.png


curBoy = newNode


image.png


约瑟夫环思路分析:


image.png

相关文章
|
2月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
65 4
|
3月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
99 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
3月前
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
55 1
|
3月前
|
存储 Java
告别混乱!用Java Map优雅管理你的数据结构
【10月更文挑战第17天】在软件开发中,随着项目复杂度增加,数据结构的组织和管理至关重要。Java中的Map接口提供了一种优雅的解决方案,帮助我们高效、清晰地管理数据。本文通过在线购物平台的案例,展示了Map在商品管理、用户管理和订单管理中的具体应用,有效提升了代码质量和维护性。
97 2
|
3月前
|
存储 Java 开发者
Java Map实战:用HashMap和TreeMap轻松解决复杂数据结构问题!
【10月更文挑战第17天】本文深入探讨了Java中HashMap和TreeMap两种Map类型的特性和应用场景。HashMap基于哈希表实现,支持高效的数据操作且允许键值为null;TreeMap基于红黑树实现,支持自然排序或自定义排序,确保元素有序。文章通过具体示例展示了两者的实战应用,帮助开发者根据实际需求选择合适的数据结构,提高开发效率。
85 2
|
9天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
21天前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
37 5
|
2月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
69 5
|
2月前
|
缓存 算法 Java
本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制
在现代软件开发中,性能优化至关重要。本文聚焦于Java内存管理与调优,介绍Java内存模型、内存泄漏检测与预防、高效字符串拼接、数据结构优化及垃圾回收机制。通过调整垃圾回收器参数、优化堆大小与布局、使用对象池和缓存技术,开发者可显著提升应用性能和稳定性。
53 6
|
2月前
|
存储 Java 索引
Java中的数据结构:ArrayList和LinkedList的比较
【10月更文挑战第28天】在Java编程世界中,数据结构是构建复杂程序的基石。本文将深入探讨两种常用的数据结构:ArrayList和LinkedList,通过直观的比喻和实例分析,揭示它们各自的优势与局限,帮助你在面对不同的编程挑战时做出明智的选择。

热门文章

最新文章