数据结构总结——Java

news2024/12/24 2:11:33

1 链表(Linked List)

1.1 单项链表(Singly Linked List)

1.1.1 图例

1.1.2 Java实现

public class ListNode {
    // 保存值
    int val;

    // 保存指针
    ListNode next;

    // 构造函数们
    public ListNode() {
    }

    public ListNode(int val) {
        this.val = val;
    }

    public ListNode(int val, ListNode next) {
        this.val = val;
        this.next = next;
    }

    // 重写toString方法方便输出
    @Override
    public String toString() {
        return "ListNode{" +
                "val=" + val +
                ", next=" + next +
                '}';
    }
}

1.1.3 常见方法

1) 测试类,创建单项链表并输出

public class ListNodeTest {
    public static void main(String[] args) {
        // 创建节点
        ListNode node1 = new ListNode(1);
        ListNode node2 = new ListNode(2);
        ListNode node3 = new ListNode(3);

        // 连起来
        node1.next = node2;
        node2.next = node3;
        node3.next = null;

        // 创建head指向链表头
        ListNode head;
        head = node1;
        System.out.println(head);
    }
}

// 输出:ListNode{val=1, next=ListNode{val=2, next=ListNode{val=3, next=null}}}

1.2 双向链表(Doubly Linked List)

1.2.1 图例

1.2.2 Java实现

public class Node {
    Node prev;
    int data;
    Node next;

    public Node() {
    }

    public Node(int data) {
        this.data = data;
    }

    public Node(Node prev, int data, Node next) {
        this.prev = prev;
        this.data = data;
        this.next = next;
    }

    @Override
    public String toString() {
        return "Node{" +
                "prev=" + prev +
                ", data=" + data +
                ", next=" + next +
                '}';
    }
}

1.2.3 常见方法

1) 测试类,创建双向链表并输出

public class NodeTest {
    public static void main(String[] args) {
        // 创建节点
        Node node1 = new Node(null, 1, null);
        Node node2 = new Node(node1, 2, null);
        Node node3 = new Node(node2, 3, null);
        Node node4 = new Node(node3, 4, null);

        // 连起来
        node1.next = node2;
        node2.next = node3;
        node3.next = node4;

        // 输出双向链表
        // 定义临时node指向表头
        Node tmp = node1;
        while(tmp != null){
            System.out.println(tmp.data);
            tmp = tmp.next;
        }

    }
}

1.3 循环链表

2 二叉树(Binary tree)

2.1 图例

2.2 Java实现

public class TreeNodeTest {
    public static void main(String[] args) {
        // 创建二叉树并输出

        // 创建节点
        TreeNode root = new TreeNode(null, 1, null);
        TreeNode left = new TreeNode(null,2, null);
        TreeNode right = new TreeNode(null, 3, null);

        // 连接成树
        root.left = left;
        root.right = right;

        // 输出二叉树
        // 先序遍历 中序遍历 后序遍历
    }
}

3 栈(Stack FILO:先进后出)

3.1 图例

3.2 Java实现

可以基于数组或链表来构建

public class Stack {
    // 数据
    Object[] data;
    // 当前栈大小
    int size;

    // 初始化栈
    public Stack(int length) {
        data = new Object[length];
    }

    // 入栈
    public void push(Object ele){
        if(size >= data.length){
            throw new RuntimeException("栈已满");
        }
        data[size] = ele;
        size++;
    }

    // 出栈
    public Object pop(){
        if(size <= 0){
            throw new RuntimeException("栈已空");
        }

        Object obj = data[size - 1];
        data[size - 1] = null;
        size--;
        return obj;

    }

    // 遍历输出栈
    public void output(){
        for(int i = size-1; i >= 0; i--){
            System.out.println(data[i]);
        }
    }

}

3.3 测试类,创建栈并输出

public class StackTest {
    public static void main(String[] args) {
        // 初始化栈
        Stack s = new Stack(3);

        // 元素入栈
        s.push('A');
        s.push('B');
        s.push('C');

        // 超过容量
//        s.push('D');
        // 输出
        s.output(); // C B A

        // 元素出栈
        s.pop();
        s.pop();

        // 输出
        s.output(); // A


    }
}

4 队列(Queue FIFO:先进先出)

4.1 图例

4.2 Java实现

public class Queue {
    // 保存数据
    Object[] values;

    // 记录存储的元素个数
    int size;

    // 构造函数
    public Queue(int length) {
        values = new Object[length];
    }

    // 向队列中添加元素
    public void add(Object ele) {
        if(size >= values.length){
            throw new RuntimeException("队列已满 添加失败");
        }

        values[size] = ele;
        size++;
    }

    // 从队头删除元素
    public Object get() {
        if(size <= 0) {
            throw new RuntimeException("队列已空  获取失败");
        }

        // 取队头元素
        Object obj = values[0];

        // do something
        for(int i = 0; i < size-1; i++){
            values[i] = values[i+1];
        }
        // 最后一个元素置空
        values[size - 1] = null;
        size--;

        return obj;
    }

    // 输出队列内容
    public void output() {
        for(int i = 0; i < size; i++){
            System.out.println(values[i]);
        }
    }
}

4.3 测试类,创建队列并输出

public class Queue {
    // 保存数据
    Object[] values;

    // 记录存储的元素个数
    int size;

    // 构造函数
    public Queue(int length) {
        values = new Object[length];
    }

    // 向队列中添加元素
    public void add(Object ele) {
        if(size >= values.length){
            throw new RuntimeException("队列已满 添加失败");
        }

        values[size] = ele;
        size++;
    }

    // 从队头删除元素
    public Object get() {
        if(size <= 0) {
            throw new RuntimeException("队列已空  获取失败");
        }

        // 取队头元素
        Object obj = values[0];

        // do something
        for(int i = 0; i < size-1; i++){
            values[i] = values[i+1];
        }
        // 最后一个元素置空
        values[size - 1] = null;
        size--;

        return obj;
    }

    // 输出队列内容
    public void output() {
        for(int i = 0; i < size; i++){
            System.out.println(values[i]);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/440084.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux基础命令-scp远程复制文件

Linux基础命令-seq打印数字序列 前言 有时候不可避免的需要将文件复制到另外一台服务器上&#xff0c;那么这时就可以使用scp命令远程拷贝文件&#xff0c;scp命令是基于SSH协议&#xff0c;在复制的过程中数据都是加密过的&#xff0c;会比明文传输更为安全。 一.命令介绍 …

Vue ElementUI Axios 前后端案例(day02) 之 ElementUI

ElementUI Element&#xff0c;一套为开发者、设计师和产品经理准备的基于 Vue 2.0 的桌面端组件库 组件 1.Layout 布局 通过基础的 24 分栏&#xff0c;迅速简便地创建布局。 就是这样分了24个格子 基础布局 使用单一分栏创建基础的栅格布局。 通过 row 和 col 组件&…

keepalived+nginx安装

欢迎使用ShowDoc&#xff01; 1、安装基础包&#xff1a; yum -y install libnl libnl-devel 2、上传包&#xff1a; tar -zxvf keepalived-2.0.20.tar.gz -C /data/imas/base_soft mkdir -p /data/imas/base_soft/keepalived cd /data/imas/base_soft/keepalived-2.0.20 .…

基于Netty开发IM即时通讯之群聊功能

本篇涉及的群聊核心功能&#xff0c;大致如下所示&#xff1a; 1&#xff09;登录&#xff1a;每个客户端连接服务端的时候&#xff0c;都需要输入自己的账号信息&#xff0c;以便和连接通道进行绑定&#xff1b;2&#xff09;创建群组&#xff1a;输入群组 ID 和群组名称进行…

【云原生进阶之容器】第六章容器网络6.5.2--Calico网络架构详述

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

从 Dev 和 Ops 视角出发,聊聊 DevSecOps 的 What / Why / How

近日&#xff0c;极小狐和 TA 的朋友们相聚上海&#xff0c;开展了一场技术 Meetup&#xff0c;从 DevSecOps 的 What、Why、How 出发&#xff0c;通过分享真实应用案例&#xff0c;与参会者交流 DevSecOps 的实践过程和落地经验。 本文整理自极狐(GitLab) 资深云原生架构师郭旭…

爬虫日常-selenium登录12306,绕过验证

文章目录 前言代码设计 前言 hello兄弟们&#xff0c;这里是无聊的网友。愉快的周末过去了&#xff0c;欢迎回到学习频道。书接上文&#xff0c;我们说到了再用selenium登录12306时遇到了滑块验证的问题。当前的网站几乎每家都会在登录模块添加一个认证&#xff0c;来规避各种…

js 同步与异步

一、js 执行机制 JavaScript语言的一大特点就是单线程&#xff0c;即&#xff08;同一时间只能做一件事情&#xff09;。因为JavaScript是为了处理页面中用户的交互&#xff0c;以及操作DOM而诞生的。比如对某个DOM元素进行添加和删除操作。不能同时进行&#xff0c;应该先进行…

一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、设计模式是什么&#xff1f; 设计模式是为了解决在软件开发过程中遇到的某些问题而形成的思想。同一场景有多种设计模式可以应…

第18章_JDK8-17新特性(上)

第18章_JDK8-17新特性&#xff08;上&#xff09; 讲师&#xff1a;尚硅谷-宋红康&#xff08;江湖人称&#xff1a;康师傅&#xff09; 官网&#xff1a;http://www.atguigu.com 本章专题与脉络 1. Java版本迭代概述 1.1 发布特点&#xff08;小步快跑&#xff0c;快速迭代…

安装TortoiseGit后桌面文件夹和用户文件夹中显示红色叹号

✨ TortoiseGit作为一个很好用的git图形化工具&#xff0c;能够很方便的进行版本控制。但在安装这个软件之后就遇到了一个问题。 &#x1f440;问题描述&#xff1a;我们知道&#xff0c;安装TortoiseGit之后,当自己版本库中文件发生更改&#xff0c;但还没有提交到受控库时&am…

信息系统管理工程师好考吗?如何去备考呢?

信息系统管理工程师有点难度&#xff0c;侧重于IT技术的中级资格考试&#xff0c;主要适合系统管理员等专业技术人员去考 一、信息系统管理工程师考试介绍&#xff1a; 考试科目有两科&#xff0c;且成绩不延续&#xff0c;考试都合格后的证书是永久有效的。 报考条件&#x…

文件改名,如何将文件复制到指定文件夹里,并设置自动编号同名文件

在工作中&#xff0c;我们经常会遇到要将文件进行备份的时候&#xff0c;那么文件名称相同的情况下要如何批量备份呢&#xff1f;又如何自动编号同名文件&#xff1f;今天小编就给大家分享一下我的操作办法。 首先&#xff0c;第一步我们要进入“文件批量改名高手”的主页面并…

pot lib:optimal transport python库

文章目录 transport1. [计算最优传输&#xff08;Computational Optimal Transport&#xff09;](https://zhuanlan.zhihu.com/p/94978686)2. 离散测度 (Discrete measures), 蒙日(Monge)问题, Kantorovich Relaxation (松弛的蒙日问题)3. scipy.stats.wasserstein_distance 距…

CVPR2023活体检测Instance-Aware Domain Generalization for Face Anti-Spoofing学习笔记

论文链接&#xff1a;https://arxiv.org/pdf/2304.05640.pdf 代码链接&#xff1a;GitHub - qianyuzqy/IADG: (CVPR 2023) Instance-Aware Domain Generalization for Face Anti-Spoofing&#xff08;尚未公布&#xff09; 研究动机 此前的基于域泛化&#xff08;domain gen…

信号完整性分析:关于传输线的三十个问题解答(二)

11.对于 50 欧姆带状线的纵横比&#xff0c;什么是好的经验法则&#xff1f;(What is a good rule of thumb for the aspect ratio of a 50-Ohm stripline?) 在带状线几何形状和 FR4 基板中&#xff0c;线宽和平面之间的电介质间距的纵横比为 。由于有两个平面&#xff0c;带…

如何快速建立一个podman环境

本文介绍如何安装podman&#xff0c;并创建podman容器 环境 Centos8 安装podman Podman 是一个容器环境&#xff0c;首先在主机上安装 Podman。执行下面命令来安装podman&#xff1a; [rootlocalhost ~]# yum -y install podman然后修改一下用户命名空间的大小&#xff1a…

202305读书笔记|《因思念而沉着》——任何赞美都是身外之物唯自由可随身携带

《因思念而沉着》作者巴哑哑&#xff0c;忘了是什么时候加入的书架&#xff0c;昨天下班地铁上读完的书。是美的&#xff01; 部分节选如下&#xff1a; 羽叶茑萝举着熄灭的花青色的小枣落了一地所以哭泣沾染上了你的脸 在没落下 当我们开始生活 就是开始患上了眼疾你独自悲伤…

互联网求职指南2023版(内含腾讯、阿里、字节真实面经)

0. 缘起 五年前&#xff0c;小编曾经写过一篇文章&#xff0c;文章主要带大家了解当时的互联网巨头公司、独角兽公司。并给出了互联网的求职建议。从简历、知识储备、暑期实习、面试上给出了中肯的建议。现在看来也是很受用的&#xff0c;感兴趣的可以点击链接《互联网求职指南…

【人工智能概论】 构建神经网络——以用InceptionNet解决MNIST任务为例

【人工智能概论】 构建神经网络——以用InceptionNet解决MNIST任务为例 文章目录 【人工智能概论】 构建神经网络——以用InceptionNet解决MNIST任务为例一. 整体思路1.1 两条原则1.2 四个步骤 二. 举例——用InceptionNet解决MNIST任务2.1 模型简介2.2 MNIST任务2.3 完整的程序…