【Java】/* 单向链表 - 底层实现 */

【难点】:remove、removeAllKey

一、IList

package bagfour;/*** Created with IntelliJ IDEA.* Description:* User: tangyuxiu* Date: 2024-08-20* Time: 20:58*/
public interface IList<E> {//头插法void addFirst(E data);//尾插法void addLast(E data);//任意位置插入,第一个数据节点为0号下标void addIndex(int pos,E data);//查找是否包含关键字key是否在单链表当中boolean contains(E key);//删除第一次出现关键字为key的节点void remove(E key);//删除所有值为key的节点void removeAllKey(E key);//得到单链表的长度int size();void clear();void display();
}

二、MyLinkedList

package bagfour;/*** Created with IntelliJ IDEA.* Description:* User: tangyuxiu* Date: 2024-08-20* Time: 20:58*/
public class MyLinkedList<E> implements IList<E> {/* 使用内部类来定义链表节点 */private static class ListNode<E> {E val;ListNode<E> next;//默认为nullpublic ListNode(E val) {this.val = val;}}private ListNode<E> head;/* 头插 */@Overridepublic void addFirst(E data) {ListNode<E> newNode = new ListNode<>(data);this.head.next = this.head;this.head = newNode;}/* 尾插 */@Overridepublic void addLast(E data) {ListNode<E> newNode = new ListNode<>(data);//1. 如果链表为nullif (this.head == null) {this.head = newNode;return;}//2. 尾插ListNode<E> cur = this.head;while (cur.next != null) {cur = cur.next;}cur.next = newNode;}/* 判断add位置是否合法 */private boolean addIndexIsLegal(int pos) {if (pos < 0 || pos > this.size()) {return false;}return true;//如果链表为null,且pos位置为0,此时也是合法的}/* 任意位置插入 */@Overridepublic void addIndex(int pos, E data) {//1. 判断add位置是否合法if (!this.addIndexIsLegal(pos)) {return;}//2. pos == 0(链表为null且index=0,也走的这里)if (pos == 0) {this.addFirst(data);return;}//3. pos == size()if (pos == this.size()) {this.addLast(data);return;}//4. 其他位置ListNode<E> newNode = new ListNode<>(data);ListNode<E> cur = this.head;//寻找pos节点的前一个节点//【思路】本来想要找到到index下标所指向的节点的,但发现// 我们要找的其实不是index下标所指向的节点而是要找到它的前一个节点// 那么我们将cur原本要走的index步,改为走index - 1步即可for (int i = 0; i < pos - 1; i++) {//这里的问题头插部分已经考虑到了🙀cur = cur.next;}newNode.next = cur.next;cur.next = newNode;}/* 是否存在某元素 */@Overridepublic boolean contains(E key) {ListNode<E> cur = this.head;while (cur != null) {if (cur.val.equals(key)) {return true;}cur = cur.next;}return false;}/* 删除第一次出现关键字为key的节点 */@Overridepublic void remove(E key) {//1. 如果链表为nullif (this.head == null) {return;}//2. 如果key在头节点处if (this.head.val.equals(key)) {this.head = this.head.next;return;}//3. 如果key在其他位置ListNode<E> pre = this.head;//找到key的前一个节点while (pre.next != null) {ListNode<E> del = pre.next;if (del.val.equals(key)) {pre.next = del.next;return;}pre = pre.next;}}/* 删除所有值为key的节点 */@Overridepublic void removeAllKey(E key) {//1. 如果链表为nullif (this.head == null) {return;}//2. 其他位置ListNode<E> pre = this.head;ListNode<E> del = pre.next;while (pre.next != null) {if (del.val.equals(key)) {pre.next = del.next;//del = del.next;} else {pre = pre.next;//del = del.next;}del = del.next;}//3. 如果key在头节点处if (this.head.val.equals(key)) {//为什么下行代码不写成pre = pre.next呢?//答:“正常”的代码中pre,find只是工具,真正的head一直仍然指向的是同一个节点this.head = this.head.next;}}/* 得到单链表的长度 */@Overridepublic int size() {int count = 0;ListNode<E> cur = this.head;while (cur != null) {count++;cur = cur.next;}return count;}/* 清空链表 */@Overridepublic void clear() {ListNode<E> cur = this.head;while (cur != null) {cur.val = null;cur = cur.next;}this.head = null;}/* 打印 */@Overridepublic void display() {ListNode<E> cur = this.head;while (cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}
}

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

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

相关文章

Linux启动流程和Systemd特性

文章目录 内核设计流派linux启动流程1.硬件加电自检2.启动加载器bootloader3.加载kernel4.init初始化5.用户终端启动 systemdsystemd特性systemd的unitunit配置文件 systemctl管理系统服务service unit服务状态 service unit文件格式Unit段Service段Install段 内核设计流派 1.…

值得一看的大模型资源

Stanford_alpha: https://github.com/tatsu-lab/stanford_alpaca 可以大致看一下&#xff1b; https://github.com/Duxiaoman-DI/XuanYuan 金融领域模型参考 https://github.com/tloen/alpaca-lora?tabreadme-ov-file Alpaca_lora,可以找个GPU卡试一下 python finetune.py…

android 实现简易音乐播放器

音乐App 源代码 &#xff1a; 简易音乐APP源代码 1、简介 一个简易的音乐APP&#xff0c;主要练习对四大组件的应用。感兴趣的可以看看。 播放界面如下&#xff1a; 歌曲列表界面如下&#xff1a; 项目结构如下&#xff1a; 接下来将对代码做详细介绍&#xff1a; 2、Musi…

【SpringCloud Alibaba】(九)学习 Gateway 服务网关

目录 1、网关概述1.1、没有网关的弊端1.2、引入 API 网关 2、主流的 API 网关2.1、NginxLua2.2、Kong 网关2.3、Zuul 网关2.4、Apache Shenyu 网关2.5、SpringCloud Gateway 网关 3、SpringCloud Gateway 网关3.1、Gateway 概述3.2、Gateway 核心架构 4、项目整合 SpringCloud …

大模型在应用开发安全左移实践

1.应用开发安全左移势在必行 近年来&#xff0c;应用系统被入侵或敏感信息泄漏类的安全事件时有发生&#xff0c;大部分安全事件的根本原因是应用软件设计或实现中存在安全漏洞。由于软件安全性问题导致各种信息泄密、信息被篡改、网络服务中断的事件频发&#xff0c;给企业和…

【鼠鼠学AI代码合集#3】简单的数据操作 (pytorch)

简单的数据操作 &#xff08;pytorch&#xff09; 张量&#xff08;Tensor&#xff09;的基本概念 张量是由数值组成的多维数组&#xff0c;可以看作是一个通用的数据容器。它可以表示从标量&#xff08;零维&#xff09;、向量&#xff08;一维&#xff09;、矩阵&#xff0…

C# 泛型类型的约束详解与示例

文章目录 一、泛型约束概述二、泛型约束详解与示例1. 类约束2. 接口约束3. 引用类型约束4. 值类型约束5. 无参数构造函数约束6、多重约束7、默认构造函数约束8、基类和接口的组合约束 三、总结 在C#编程语言中&#xff0c;泛型是一种非常强大的特性&#xff0c;它允许我们编写可…

从代码出发,一次性理解 JS 事件流

你好&#xff0c;我是沐爸&#xff0c;欢迎点赞、收藏、评论和关注。个人知乎 掌握 JavaScript 事件流可以深入理解事件在Web页面上的传播方式&#xff0c;这对于开发交互式和动态网页至关重要。理解事件流可以帮助你更有效地控制事件的行为&#xff0c;避免不必要的事件冲突&a…

图解Redis五大数据类型

五种数据类型的不同之处&#xff0c;是value在存储时的形式不同。 hash类型 value类型是<key,value>键值对。如果发生hash冲突&#xff0c;用开放定址法解决&#xff0c;不拉链&#xff01; key值重复&#xff0c;则新值覆盖旧值 List类型 Set类型 与List的类似&…

3款一键AI智能改写软件,轻松改出高质量文章 tzq

随着科技的不断发展&#xff0c;人工智能技术正逐渐渗透到各个领域。在写作方面&#xff0c;一键AI智能改写软件的出现&#xff0c;为人们提供了更加便捷高效的写作工具。无论是写作初学者还是专业作家&#xff0c;都可以通过这些软件轻松改写出高质量的文章。本文将介绍三款优…

查找数学类文献的专业数据库有哪些 如何获取这些数据库资源

一、MathSciNet&#xff08;美国数学会《数学评论》&#xff09; MathSciNet数据库是美国数学学会出版的《数学评论》Mathematical Reviews和Current Mathematical Publications的网络版&#xff0c;包含《数学评论》自1940年出版以来的所有评论文章&#xff0c;包括期刊、图书…

电子电气架构---车载网简史(下)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消耗你的人和事,多看一眼都是你的不对。非必要不费力证明自己,无利益不试图说服别人,是精神上的节…

【AI+编程】只需1句提示词0代码生成前端展示效果

最近被Vercel发布的V0 编程效果惊艳到了&#xff0c; 不管是前端开发 还是立志成为全栈工程师的 同学&#xff0c;不可错过。 官网地址&#xff1a;https://v0.dev/chat/ 代码生成工具很多&#xff0c;不管是github copilot、阿里的通义灵码&#xff0c; 腾讯云的AI代码助手…

PyTorch升级之旅——主要组成模块

本文仅作为个人学习记录使用 文章目录 前言 一、深度学习的简单流程 二、基本配置 三、数据读入 四、模型构建 五、模型初始化 六、损失函数 七、训练和评估 八、可视化 九、PyTorch优化器 总结 前言 学习链接&#xff1a;第三章&#xff1a;PyTorch的主要组成模块…

leetcode 80 删除有序数组中的重复项 II

正文 仍旧使用双指针&#xff0c; 思想与 leetcode 26 删除有序数组中的重复项 一致。只是此时因为要求保留重复元素两次&#xff0c;我们的左侧指针可以从第二个数据开始&#xff0c;且右侧指针需要和两个元素的值进行判断。 class Solution:def removeDuplicates(self, nums…

深度学习入门:循环神经网络------RNN概述,词嵌入层,循环网络层及案例实践!(万字详解!)

目录 &#x1f354; RNN 概述 1.1 循环神经网络 1.2 自然语言处理 &#x1f354; 词嵌入层 2.1 词嵌入层的使用 2.2 关于词嵌入层的思考 2.3 小节 &#x1f354; 循环网络层 3.1 RNN 网络原理 3.1.1 RNN计算过程 3.1.2 如何计算神经元内部 3.2 PyTorch RNN 层的使用…

总结:Python语法

Python中的字典、列表和数组是三种常用的数据结构&#xff0c;它们各自有不同的用途和特性。 字典&#xff08;Dictionary&#xff09; 字典是一种无序的、可变的数据结构&#xff0c;它存储键值对&#xff08;key-value pairs&#xff09;。字典中的每个元素都是一个键值对&…

Flask返回Json格式字符,中文导致unicode乱码问题

一.问题描述 或者直接返回json格式的字符串 从上图可以看出&#xff0c;当flask实现的接口响应中存在中文时&#xff0c;接口返回json字串的中文为unicode乱码。 二.问题解决 百度搜索了很多&#xff0c;原来在创建flask app时使用json格式的字符串&#xff0c;默认是ascii编…

字节微前端框架Garfish

Garfish 是字节跳动开源的微前端框架&#xff0c;旨在应对现代 Web 应用在前端生态繁荣与应用日益复杂化背景下的挑战。本文将介绍如何使用 Garfish&#xff0c;提供代码示例&#xff0c;并与另一流行的微前端框架 Qiankun 进行对比分析。 安装 Garfish 首先&#xff0c;安装…