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

相关文章
|
7月前
|
前端开发 Java
java实现队列数据结构代码详解
本文详细解析了Java中队列数据结构的实现,包括队列的基本概念、应用场景及代码实现。队列是一种遵循“先进先出”原则的线性结构,支持在队尾插入和队头删除操作。文章介绍了顺序队列与链式队列,并重点分析了循环队列的实现方式以解决溢出问题。通过具体代码示例(如`enqueue`入队和`dequeue`出队),展示了队列的操作逻辑,帮助读者深入理解其工作机制。
184 1
|
5月前
|
存储 安全 Java
Java 集合面试题从数据结构到 HashMap 源码剖析详解及长尾考点梳理
本文深入解析Java集合框架,涵盖基础概念、常见集合类型及HashMap的底层数据结构与源码实现。从Collection、Map到Iterator接口,逐一剖析其特性与应用场景。重点解读HashMap在JDK1.7与1.8中的数据结构演变,包括数组+链表+红黑树优化,以及put方法和扩容机制的实现细节。结合订单管理与用户权限管理等实际案例,展示集合框架的应用价值,助你全面掌握相关知识,轻松应对面试与开发需求。
225 3
|
12月前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
195 4
|
存储 Java
Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。
【10月更文挑战第19天】本文详细介绍了Java中的HashMap和TreeMap,通过具体示例展示了它们在处理复杂数据结构问题时的应用。HashMap以其高效的插入、查找和删除操作著称,而TreeMap则擅长于保持元素的自然排序或自定义排序,两者各具优势,适用于不同的开发场景。
130 1
|
7月前
|
存储 Java 编译器
Java 中 .length 的使用方法:深入理解 Java 数据结构中的长度获取机制
本文深入解析了 Java 中 `.length` 的使用方法及其在不同数据结构中的应用。对于数组,通过 `.length` 属性获取元素数量;字符串则使用 `.length()` 方法计算字符数;集合类如 `ArrayList` 采用 `.size()` 方法统计元素个数。此外,基本数据类型和包装类不支持长度属性。掌握这些区别,有助于开发者避免常见错误,提升代码质量。
600 1
|
9月前
|
存储 机器学习/深度学习 算法
C 408—《数据结构》算法题基础篇—链表(下)
408考研——《数据结构》算法题基础篇之链表(下)。
242 30
|
9月前
|
存储 算法 C语言
C 408—《数据结构》算法题基础篇—链表(上)
408考研——《数据结构》算法题基础篇之链表(上)。
388 25
|
10月前
|
机器学习/深度学习 存储 C++
【C++数据结构——线性表】单链表的基本运算(头歌实践教学平台习题)【合集】
本内容介绍了单链表的基本运算任务,涵盖线性表的基本概念、初始化、销毁、判定是否为空表、求长度、输出、求元素值、按元素值查找、插入和删除数据元素等操作。通过C++代码示例详细解释了顺序表和链表的实现方法,并提供了测试说明、通 - **任务描述**:实现单链表的基本运算。 - **相关知识**:包括线性表的概念、初始化、销毁、判断空表、求长度、输出、求元素值、查找、插入和删除等操作。 - **测试说明**:平台会对你编写的代码进行测试,提供测试输入和预期输出。 - **通关代码**:给出了完整的C++代码实现。 - **测试结果**:展示了测试通过后的预期输出结果。 开始你的任务吧,祝你成功!
387 5
|
11月前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
11月前
|
存储 缓存 安全
Java 集合江湖:底层数据结构的大揭秘!
小米是一位热爱技术分享的程序员,本文详细解析了Java面试中常见的List、Set、Map的区别。不仅介绍了它们的基本特性和实现类,还深入探讨了各自的使用场景和面试技巧,帮助读者更好地理解和应对相关问题。
163 5
下一篇
开通oss服务