当前位置: 首页 > news >正文

数据结构---链表(java)

目录

1. 链表

2. 创建Node

3. 增加

4. 获取元素

5. 删除

6. 遍历链表

7. 查找元素是否存在

8. 链栈的实现

9. 链队的实现 


1. 链表

  • 数据存放在"Node"结点中

优点:不用考虑扩容和缩容的问题,实现了动态存储数据

缺点:没有随机访问的能力

2. 创建Node

先创建一个MyLinkedList类,初始化Node结点内部类

private class Node {private T val;private Node next;public Node() {this.val = null;this.next = null;}public Node(T val) {this.val = val;this.next = null;}}

3. 增加

<1> 在头部添加

public void addHead(T val) {Node node = new Node(val);node.next = this.header;this.header = node;this.size++;}

<2> 在尾部添加

public void tail(T val) {Node node = new Node(val);this.size++;if(header.next==null){this.header=node;return;}Node cur = header;while (cur.next!=null){cur = cur.next;}cur.next=node;}

<3> 在任意位置添加

public void add(int index, T val) {if (index < 0 || index > this.size) {throw new IllegalArgumentException("index is invalid");}//要插入的结点Node node = new Node(val);//新建一个虚拟头节点Node dummyHead = new Node(null);dummyHead.next = header;Node pre = dummyHead;//找到待插入位置的前一个结点for (int i = 0; i < index; i++) {pre = pre.next;}node.next = pre.next;pre.next = node;//更新头节点header = dummyHead.next;this.size++;}

4. 获取元素

<1> 获取头部元素

public T getHead() {if (isEmpty()) {return null;}return header.val;
}

<2> 获取尾部元素

public T getHail() {if (isEmpty()) {return null;}Node cur = this.header;while (cur.next != null) {cur = cur.next;}return cur.val;}

<3> 获取任意节点元素

public T get(int index) {if (index < 0 || index > this.size) {throw new IllegalArgumentException("index is invalid");}Node cur = this.header;int i = 1;while (i <= index) {cur = cur.next;i++;}return cur.val;}

5. 删除

<1> 通过下标删除结点

public Optional<T> removeByIndex(int index){if(index<0||index>=this.size){return Optional.empty();}//判断是否是头结点//使用虚拟头节点Node dummyNode = new Node(null);dummyNode.next = header;Node pre = dummyNode;int i=1;//寻找要删除的结点while(i<=index){pre = pre.next;i++;}//改变指针指向Node delNode = pre.next;pre.next = delNode.next;delNode.next = null;this.size--;this.header = dummyNode.next;return Optional.of(delNode.val);}

<2> 通过值删除结点

public void removeByVal(T val){if(isEmpty()){return;}Node dummyNode = new Node(null);dummyNode.next = header;Node pre = dummyNode;while(pre.next!=null){Node cur = pre.next;if(cur.val.equals(val)){pre.next=cur.next;cur.next=null;size--;}else {pre = pre.next;}}header = dummyNode.next;}

<3> 不使用虚拟头结点删除元素

public void removeWithoutDummyHead(T val){while(this.header!=null&&this.header.val.equals(val)){this.header = this.header.next;this.size--;}if(this.header==null){return;}//此时头节点一定不是要删除的结点Node pre = this.header;while(pre.next!=null){if(pre.next.val.equals(val)){pre.next = pre.next.next;this.size--;}else{pre = pre.next;}}
}

6. 遍历链表

重写toString()方法,将他拼接成链表的样子

@Overridepublic String toString() {//创建一个临时结点Node cru = header;StringBuffer sb = new StringBuffer();while (cru != null) {sb.append(cru.val + "--->");cru = cru.next;}sb.append("Null");return sb.toString();}

7. 查找元素是否存在

public boolean contains(T val) {Node res = new Node(val);Node cur = header;for (int i = 0; i < this.size; i++) {if (res.val.equals(cur.val)) {return true;}cur = cur.next;}return false;}

8. 链栈的实现

public interface Stack<T> {void push(T element);T pop();int getSize();boolean isEmpty();T peek();
}
public class LinkedStack<T> implements Stack<T> {private MyLinkedList<T> data;public LinkedStack(MyLinkedList<T> data) {this.data = data;}@Overridepublic void push(T element) {this.data.addTail(element);}@Overridepublic T pop() {Optional<T> optional = this.data.removeByIndex(0);if(optional.isPresent()){return optional.get();}return null;}@Overridepublic int getSize() {return this.data.getSize();}@Overridepublic boolean isEmpty() {return this.data.isEmpty();}@Overridepublic T peek() {return this.data.getHead();}
}

9. 链队的实现 

public interface Queue<T>{void offer(T ele);T poll();boolean isEmpty();int getSize();T getFront();
}
public class LinkedQueue implements Queue {private MyLinkedList data;public LinkedQueue(MyLinkedList myLinkedList) {this.data = myLinkedList;}@Overridepublic void offer(Object ele) {this.data.addTail(ele);}@Overridepublic Object poll() {return this.data.removeByIndex(0);}@Overridepublic boolean isEmpty() {return this.data.isEmpty();}@Overridepublic int getSize() {return this.data.getSize();}@Overridepublic Object getFront() {return this.data.getHead();}
}

相关文章:

数据结构---链表(java)

目录 1. 链表 2. 创建Node 3. 增加 4. 获取元素 5. 删除 6. 遍历链表 7. 查找元素是否存在 8. 链栈的实现 9. 链队的实现 1. 链表 数据存放在"Node"结点中 优点&#xff1a;不用考虑扩容和缩容的问题&#xff0c;实现了动态存储数据 缺点&#xff1a;没有…...

Qt --- Day02

实现效果&#xff1a; 点击登录&#xff0c;检验用户密码是否正确&#xff0c;正确则弹出消息框&#xff0c;点击ok转到另一个页面 不正确跳出错误消息框&#xff0c;默认选线为Cancel&#xff0c;点击Yes继续登录 点击Cancel跳出问题消息框&#xff0c;默认选项No&#xff0c…...

Redis 集合(Set)快速指南 | Navicat

Redis 支持通过多种数据类型来存储项目集合。其中&#xff0c;包括列表、集合和哈希。上周的博文介绍了列表&#xff08;List&#xff09;数据类型并重点介绍了一些用于管理列表&#xff08;List&#xff09;的主要命令。在今天的文章中&#xff0c;我们将转向关注集合&#xf…...

【华为云云耀云服务器L实例评测】- 云原生实践,快捷部署人才招聘平台容器化技术方案!

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…...

【Java】泛型 之 什么是泛型

什么是泛型 泛型是一种“代码模板”&#xff0c;可以用一套代码套用各种类型。 在讲解什么是泛型之前&#xff0c;我们先观察Java标准库提供的ArrayList&#xff0c;它可以看作“可变长度”的数组&#xff0c;因为用起来比数组更方便。 实际上ArrayList内部就是一个Object[]…...

Python yaml 详解

文章目录 1 概述1.1 特点1.2 导入 2 对象2.1 字典2.2 数组2.3 复合结构 3 操作3.1 读取3.2 写入 1 概述 1.1 特点 yaml 文件是一种数据序列化语言&#xff0c;广泛用于配置文件、日志文件等特点&#xff1a; ① 大小写敏感。② 使用缩进表示层级关系。缩进时不允许使用 Tab 键…...

RabbitMQ消息可靠性(二)-- 消费者消息确认

一、消费者消息确认是什么&#xff1f; 在这种机制下&#xff0c;消费者在接收到消息后&#xff0c;需要向 RabbitMQ 发送确认信息&#xff0c;告知 RabbitMQ 已经接收到该消息&#xff0c;并已经处理完毕。如果 RabbitMQ 没有接收到确认信息&#xff0c;则会将该消息重新加入…...

【python第7课 实例,类】

文章目录 一、实例1.1实例的变量1.2实例方法1.3 构造方法1.4析构函数1.4预置实例属性&#xff1a; 二&#xff0c;类1.1类变量1.2类方法1.3静态方法1.4类属性的增删改查 一、实例 1.1实例的变量 使用示例 class dog:def __init__(self,k,c,a):self.kinds kself.color csel…...

RocketMQ源码解析(上)

一、ACL权限控制 应用场景&#xff1a; ​RocketMQ提供了针对队列、用户等不同维度的非常全面的权限管理机制。通常来说&#xff0c;RocketMQ作为一个内部服务&#xff0c;是不需要进行权限控制的&#xff0c;但是&#xff0c;如果要通过RocketMQ进行跨部门甚至跨公司的合作&…...

Webpack打包CSS文件,解决You may need an appropriate loader to handle this file type报错

在项目文件夹下创建webpack.config.js文件&#xff0c;该文件就是Webpack的配置文件 注意&#xff1a;该文件中遵循Node.js的代码格式规范 &#xff0c;需要对导出配置文件中的内容 Webpack在默认情况下只能打包js文件&#xff0c;如果我们希望他能够打包其他类型的文件&#…...

轮换对称性

二重积分 普通对称性–D关于 y x yx yx对称&#xff1a; ∬ D f ( x , y ) d σ { 2 ∬ D 1 f ( x , y ) d σ f ( x , y ) f ( y , x ) 0 f ( x , y ) − f ( y , x ) \iint_{D}f(x,y)d\sigma\begin{cases} 2\iint_{D_1}f(x,y)d\sigma\ \ \ \ \ \ f(x,y)f(y,x) \\ 0 \ \…...

【MySQL基础】--- 约束

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、什么…...

ROS2 的行为树 — 第 1 部分:解锁高级机器人决策和控制

一、说明 在复杂而迷人的机器人世界中&#xff0c;行为树&#xff08;BT&#xff09;已成为决策过程中不可或缺的一部分。它们提供了一种结构化、模块化和高效的方法来对机器人的行为进行编程。BT起源于视频游戏行业&#xff0c;用于控制非玩家角色&#xff0c;他们在机器人领域…...

kafka事务的详解

一 kafka事务的机制 1.1 kafka的事务机制 通过事务机制&#xff0c;KAFKA 可以实现对多个 topic 的多个 partition 的原子性的写入&#xff0c;即处于同一个事务内的所有消息&#xff0c;不管最终需要落地到哪个 topic 的哪个 partition, 最终结果都是要么全部写成功&#xf…...

Flutter Fair逻辑动态化架构设计与实现

本文的核心内容包括: 数据逻辑处理布局中的逻辑处理Flutter类型数据处理一、数据逻辑处理 我们接触的每一个Flutter界面,大多由布局和逻辑相关的代码组成。如Flutter初始工程的Counting Demo的代码: class _MyHomePageState extends State<MyHomePage> {// 变量 int…...

【每日一题】74. 搜索二维矩阵

74. 搜索二维矩阵 - 力扣&#xff08;LeetCode&#xff09; 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返…...

软件测试进大厂,拿高薪,怎么做?看这里!

有些同学大学专业不对口&#xff0c;但有想进大厂想拿高薪心&#xff0c;只要你有想法&#xff0c;那就一定有实现的方法。 俗话说&#xff1a;“世间无难事&#xff0c;只怕有心人”。仔细思索一下&#xff0c;哪家大厂能缺软件测试这一重要职位。相对大学所学专业而言&#…...

【读书笔记】基于世界500强的高薪实战Kubernetes课程

第1章 课程简介&&自我介绍 1-1 自我介绍 1-2 课程大纲内容介绍 1-3 课程更新通知 第2章 K8s必备知识-Docker容器基础入门 2-1 课程介绍 2-2 docker容器介绍 2-3 docker优缺点 2-4 安装和配置docker 2-5 修改内核参数 2-6 配置镜像加速器 2-7 配置常用镜像加…...

【Java 基础篇】Java并发包详解

多线程编程是Java开发中一个重要的方面&#xff0c;它能够提高程序的性能和响应能力。然而&#xff0c;多线程编程也伴随着一系列的挑战&#xff0c;如线程安全、死锁、性能问题等。为了解决这些问题&#xff0c;Java提供了一套强大的并发包。本文将详细介绍Java并发包的各个组…...

MYSQL存储引擎基础知识介绍

下面重点介绍几种常用的存储引擎,并对比各个存储引擎之间的区别&#xff0c;以帮助读者理解 不同存储引擎的使用方式。 MyISAM MyISAM是 MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键&#xff0c;其优势是访 问的速度快&#xff0c;对事务完整性没有要求或者以 SEL…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

linux arm系统烧录

1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 &#xff08;忘了有没有这步了 估计有&#xff09; 刷机程序 和 镜像 就不提供了。要刷的时…...

屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!

5月28日&#xff0c;中天合创屋面分布式光伏发电项目顺利并网发电&#xff0c;该项目位于内蒙古自治区鄂尔多斯市乌审旗&#xff0c;项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站&#xff0c;总装机容量为9.96MWp。 项目投运后&#xff0c;每年可节约标煤3670…...

音视频——I2S 协议详解

I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议&#xff0c;专门用于在数字音频设备之间传输数字音频数据。它由飞利浦&#xff08;Philips&#xff09;公司开发&#xff0c;以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

Selenium常用函数介绍

目录 一&#xff0c;元素定位 1.1 cssSeector 1.2 xpath 二&#xff0c;操作测试对象 三&#xff0c;窗口 3.1 案例 3.2 窗口切换 3.3 窗口大小 3.4 屏幕截图 3.5 关闭窗口 四&#xff0c;弹窗 五&#xff0c;等待 六&#xff0c;导航 七&#xff0c;文件上传 …...

PostgreSQL 与 SQL 基础:为 Fast API 打下数据基础

在构建任何动态、数据驱动的Web API时&#xff0c;一个稳定高效的数据存储方案是不可或缺的。对于使用Python FastAPI的开发者来说&#xff0c;深入理解关系型数据库的工作原理、掌握SQL这门与数据库“对话”的语言&#xff0c;以及学会如何在Python中操作数据库&#xff0c;是…...

21-Oracle 23 ai-Automatic SQL Plan Management(SPM)

小伙伴们&#xff0c;有没有迁移数据库完毕后或是突然某一天在同一个实例上同样的SQL&#xff0c; 性能不一样了、业务反馈卡顿、业务超时等各种匪夷所思的现状。 于是SPM定位开始&#xff0c;OCM考试中SPM必考。 其他的AWR、ASH、SQLHC、SQLT、SQL profile等换作下一个话题…...

开源 vGPU 方案:HAMi,实现细粒度 GPU 切分

本文主要分享一个开源的 GPU 虚拟化方案&#xff1a;HAMi&#xff0c;包括如何安装、配置以及使用。 相比于上一篇分享的 TimeSlicing 方案&#xff0c;HAMi 除了 GPU 共享之外还可以实现 GPU core、memory 得限制&#xff0c;保证共享同一 GPU 的各个 Pod 都能拿到足够的资源。…...

OCC笔记:TDF_Label中有多个相同类型属性

注&#xff1a;OCCT版本&#xff1a;7.9.1 TDF_Label中有多个相同类型的属性的方案 OCAF imposes the restriction that only one attribute type may be allocated to one label. It is necessary to take into account the design of the application data tree. For exampl…...