数据结构---链表(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"结点中 优点:不用考虑扩容和缩容的问题,实现了动态存储数据 缺点:没有…...

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

Redis 集合(Set)快速指南 | Navicat
Redis 支持通过多种数据类型来存储项目集合。其中,包括列表、集合和哈希。上周的博文介绍了列表(List)数据类型并重点介绍了一些用于管理列表(List)的主要命令。在今天的文章中,我们将转向关注集合…...

【华为云云耀云服务器L实例评测】- 云原生实践,快捷部署人才招聘平台容器化技术方案!
🤵♂️ 个人主页: AI_magician 📡主页地址: 作者简介:CSDN内容合伙人,全栈领域优质创作者。 👨💻景愿:旨在于能和更多的热爱计算机的伙伴一起成长!!&…...
【Java】泛型 之 什么是泛型
什么是泛型 泛型是一种“代码模板”,可以用一套代码套用各种类型。 在讲解什么是泛型之前,我们先观察Java标准库提供的ArrayList,它可以看作“可变长度”的数组,因为用起来比数组更方便。 实际上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 文件是一种数据序列化语言,广泛用于配置文件、日志文件等特点: ① 大小写敏感。② 使用缩进表示层级关系。缩进时不允许使用 Tab 键…...
RabbitMQ消息可靠性(二)-- 消费者消息确认
一、消费者消息确认是什么? 在这种机制下,消费者在接收到消息后,需要向 RabbitMQ 发送确认信息,告知 RabbitMQ 已经接收到该消息,并已经处理完毕。如果 RabbitMQ 没有接收到确认信息,则会将该消息重新加入…...
【python第7课 实例,类】
文章目录 一、实例1.1实例的变量1.2实例方法1.3 构造方法1.4析构函数1.4预置实例属性: 二,类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权限控制 应用场景: RocketMQ提供了针对队列、用户等不同维度的非常全面的权限管理机制。通常来说,RocketMQ作为一个内部服务,是不需要进行权限控制的,但是,如果要通过RocketMQ进行跨部门甚至跨公司的合作&…...

Webpack打包CSS文件,解决You may need an appropriate loader to handle this file type报错
在项目文件夹下创建webpack.config.js文件,该文件就是Webpack的配置文件 注意:该文件中遵循Node.js的代码格式规范 ,需要对导出配置文件中的内容 Webpack在默认情况下只能打包js文件,如果我们希望他能够打包其他类型的文件&#…...

轮换对称性
二重积分 普通对称性–D关于 y x yx yx对称: ∬ 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基础】--- 约束
个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】🎈 本专栏旨在分享学习MySQL的一点学习心得,欢迎大家在评论区讨论💌 目录 一、什么…...

ROS2 的行为树 — 第 1 部分:解锁高级机器人决策和控制
一、说明 在复杂而迷人的机器人世界中,行为树(BT)已成为决策过程中不可或缺的一部分。它们提供了一种结构化、模块化和高效的方法来对机器人的行为进行编程。BT起源于视频游戏行业,用于控制非玩家角色,他们在机器人领域…...
kafka事务的详解
一 kafka事务的机制 1.1 kafka的事务机制 通过事务机制,KAFKA 可以实现对多个 topic 的多个 partition 的原子性的写入,即处于同一个事务内的所有消息,不管最终需要落地到哪个 topic 的哪个 partition, 最终结果都是要么全部写成功…...
Flutter Fair逻辑动态化架构设计与实现
本文的核心内容包括: 数据逻辑处理布局中的逻辑处理Flutter类型数据处理一、数据逻辑处理 我们接触的每一个Flutter界面,大多由布局和逻辑相关的代码组成。如Flutter初始工程的Counting Demo的代码: class _MyHomePageState extends State<MyHomePage> {// 变量 int…...

【每日一题】74. 搜索二维矩阵
74. 搜索二维矩阵 - 力扣(LeetCode) 给你一个满足下述两条属性的 m x n 整数矩阵: 每行中的整数从左到右按非递减顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target ,如果 target 在矩阵中,返…...

软件测试进大厂,拿高薪,怎么做?看这里!
有些同学大学专业不对口,但有想进大厂想拿高薪心,只要你有想法,那就一定有实现的方法。 俗话说:“世间无难事,只怕有心人”。仔细思索一下,哪家大厂能缺软件测试这一重要职位。相对大学所学专业而言&#…...
【读书笔记】基于世界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开发中一个重要的方面,它能够提高程序的性能和响应能力。然而,多线程编程也伴随着一系列的挑战,如线程安全、死锁、性能问题等。为了解决这些问题,Java提供了一套强大的并发包。本文将详细介绍Java并发包的各个组…...

MYSQL存储引擎基础知识介绍
下面重点介绍几种常用的存储引擎,并对比各个存储引擎之间的区别,以帮助读者理解 不同存储引擎的使用方式。 MyISAM MyISAM是 MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,其优势是访 问的速度快,对事务完整性没有要求或者以 SEL…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...

简易版抽奖活动的设计技术方案
1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

黑马Mybatis
Mybatis 表现层:页面展示 业务层:逻辑处理 持久层:持久数据化保存 在这里插入图片描述 Mybatis快速入门 
最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

多模态大语言模型arxiv论文略读(108)
CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文标题:CROME: Cross-Modal Adapters for Efficient Multimodal LLM ➡️ 论文作者:Sayna Ebrahimi, Sercan O. Arik, Tejas Nama, Tomas Pfister ➡️ 研究机构: Google Cloud AI Re…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...

2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器
一、原理介绍 传统滑模观测器采用如下结构: 传统SMO中LPF会带来相位延迟和幅值衰减,并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF),可以去除高次谐波,并且不用相位补偿就可以获得一个误差较小的转子位…...