数据结构和算法,单链表的实现(kotlin版)
文章目录
- 数据结构和算法,单链表的实现(kotlin版)
- b站视频链接
- 1.定义接口,我们需要实现的方法
- 2.定义节点,表示每个链表节点。
- 3.push(e: E),链表尾部新增一个节点
- 4.size(): Int,返回链表的长度
- 5.getValue(index: Int): E?,获取列表的value值
- 6.insert(index: Int,e: E),从任意位置插入一个节点
- 7.remove(index: Int),任意位置删除一个节点
- 8.完整Demo
数据结构和算法,单链表的实现(kotlin版)
b站视频链接
单链表的实现–koltin版本
1.定义接口,我们需要实现的方法
interface LinkedListAction<E> {fun push(e: E)fun size(): Intfun getValue(index: Int): E?fun insert(index: Int,e: E)fun remove(index: Int)
}
2.定义节点,表示每个链表节点。
data class Node<E>(var next: Node<E>? = null, var value: E)
3.push(e: E),链表尾部新增一个节点
override fun push(e: E) {val newNode = Node(null, e)if (head != null) {
// val lastNode = node(len - 1)//O(1)时间复杂度last?.next = newNode} else {head = newNode}last = newNodelen++}
4.size(): Int,返回链表的长度
override fun size(): Int {return len}
5.getValue(index: Int): E?,获取列表的value值
override fun getValue(index: Int): E? {if (index < 0 || index >= len) {throw ArrayIndexOutOfBoundsException("数组越界.....")}return node(index)?.value}//找到对应index下标的节点。private fun node(index: Int): Node<E>? {var h = head//O(n)时间复杂度for (i in 0 until index) {h = h?.next}return h}
6.insert(index: Int,e: E),从任意位置插入一个节点
override fun insert(index: Int, e: E) {val newNode = Node(null, e)//考虑边界if (index == 0) {val h = headhead = newNodenewNode.next = h} else {//考虑最后一个位置val prev = node(index - 1)val next = prev?.nextprev?.next = newNodenewNode.next = next}len++}//找到对应index下标的节点。private fun node(index: Int): Node<E>? {var h = head//O(n)时间复杂度for (i in 0 until index) {h = h?.next}return h}
7.remove(index: Int),任意位置删除一个节点
override fun remove(index: Int) {if (index < 0 || index >= len) {throw ArrayIndexOutOfBoundsException("数组越界.....")}if (index == 0) {val h = headhead = h?.nexth?.next = null} else {val prev = node(index - 1)val current = prev?.nextprev?.next = current?.nextcurrent?.next = null}len--}//找到对应index下标的节点。private fun node(index: Int): Node<E>? {var h = head//O(n)时间复杂度for (i in 0 until index) {h = h?.next}return h}
8.完整Demo
package day1class LinkedList<E> : LinkedListAction<E> {//头指针private var head: Node<E>? = null//优化时间复杂度private var last: Node<E>? = null//集合的长度private var len = 0override fun push(e: E) {val newNode = Node(null, e)if (head != null) {
// val lastNode = node(len - 1)//O(1)时间复杂度last?.next = newNode} else {head = newNode}last = newNodelen++}//找到对应index下标的节点。private fun node(index: Int): Node<E>? {var h = head//O(n)时间复杂度for (i in 0 until index) {h = h?.next}return h}override fun size(): Int {return len}override fun getValue(index: Int): E? {if (index < 0 || index >= len) {throw ArrayIndexOutOfBoundsException("数组越界.....")}return node(index)?.value}override fun insert(index: Int, e: E) {val newNode = Node(null, e)//考虑边界if (index == 0) {val h = headhead = newNodenewNode.next = h} else {//考虑最后一个位置val prev = node(index - 1)val next = prev?.nextprev?.next = newNodenewNode.next = next}len++}override fun remove(index: Int) {if (index < 0 || index >= len) {throw ArrayIndexOutOfBoundsException("数组越界.....")}if (index == 0) {val h = headhead = h?.nexth?.next = null} else {val prev = node(index - 1)val current = prev?.nextprev?.next = current?.nextcurrent?.next = null}len--}}
相关文章:
数据结构和算法,单链表的实现(kotlin版)
文章目录 数据结构和算法,单链表的实现(kotlin版)b站视频链接1.定义接口,我们需要实现的方法2.定义节点,表示每个链表节点。3.push(e: E),链表尾部新增一个节点4.size(): Int,返回链表的长度5.getValue(index: Int): E…...
Jdk17是否有可能代替 Jdk8
JDK发展历史和开源 2006年SUN公司开源JDK,成立OpenJDK组织。2009年Oracle收购SUN,加快JDK发布周期。Oracle JDK与OpenJDK功能基本一致,但Oracle JDK提供更长时间的更新支持。 JDK版本特性 JDK11是长期支持版本(LTS)…...
oca和 ocp有什么区别
OCA(Oracle Certified Associate)和OCP(Oracle Certified Professional)在Oracle的认证体系中是两种不同级别的认证,它们之间存在明显的区别。以下是对两者区别的详细解释: 认证级别: OCA&…...
煤矿安全大模型:微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答
煤矿安全大模型————矿途智护者 使用煤矿历史事故案例,事故处理报告、安全规程规章制度、技术文档、煤矿从业人员入职考试题库等数据,微调internlm2模型实现针对煤矿事故和煤矿安全知识的智能问答。 本项目简介: 近年来,国家对煤矿安全生产的重视程度不断提升。为了确…...
C++中的C++中的虚析构函数的作用和重要性
在C中,虚析构函数(virtual destructor)的作用和重要性主要体现在多态和继承的上下文中。了解这一点之前,我们先简要回顾一下多态和继承的基本概念。 继承与多态 继承:允许我们定义一个基类(也称为父类或超…...
机器学习 - 文本特征处理之 TF 和 IDF
TF(Term Frequency,词频)和IDF(Inverse Document Frequency,逆文档频率)是文本处理和信息检索中的两个重要概念,常用于计算一个词在文档中的重要性。下面是详细解释: TF(…...
因为自己淋过雨所以想给嵌入式撑把伞
在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「嵌入式的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!!新手学嵌入式,…...
《C++20设计模式》中单例模式
文章目录 一、前言二、饿汉式1、实现 三、懒汉式1、实现 四、最后 一、前言 单例模式定义: 单例模式(Singleton Pattern)是一种创建型设计模式,其主要目的是确保一个类只有一个实例,并提供全局访问点来访问这个实例。…...
前端技术(说明篇)
Introduction ##编写内容:1.前端概念梳理 2.前端技术种类 3.前端学习方式 ##编写人:贾雯爽 ##最后更新时间:2024/07/01 Overview 最近在广州粤嵌进行实习,项目名称是”基于Node实现多人聊天室“,主要内容是对前端界…...
带电池监控功能的恒流直流负载组
EAK的交流和直流工业电池负载组测试仪对于测试和验证关键电力系统的能力至关重要,旨在实现最佳精度。作为一家客户至上的公司,我们继续尽我们所能应对供应链挑战,以提供出色的交货时间,大约是行业其他公司的一半。 交流负载组 我…...
关于Disruptor监听策略
Disruptor框架提供了多种等待策略,每种策略都有其适用的场景和特点。以下是这些策略的详细介绍及其适用场景: 1. BlockingWaitStrategy 特点: 使用锁和条件变量进行线程间通信,线程在等待时会进入阻塞状态,释放CPU资…...
大数据面试题之HBase(3)
HBase的预分区 HBase的热点问题 HBase的memstore冲刷条件 HBase的MVCC HBase的大合并与小合并,大合并是如何做的?为什么要大合并 既然HBase底层数据是存储在HDFS上,为什么不直接使用HDFS,而还要用HBase HBase和Phoenix的区别 HBase支…...
c#中赋值、浅拷贝和深拷贝
在 C# 编程中,深拷贝(Deep Copy)和浅拷贝(Shallow Copy)是用于复制对象的两种不同方式,它们在处理对象时有着重要的区别和适用场景。 浅拷贝(Shallow Copy) 浅拷贝是指创建一个新对…...
旧版st7789屏幕模块 没有CS引脚的天坑 已解决!!!
今天解决了天坑一个,大家可能有的人买的是st7789屏幕模块,240x240,1.3寸的 他标注的是老版,没有CS引脚,小崽子长这样: 这熊孩子用很多通用的驱动不吃,死活不显示,网上猛搜ÿ…...
激光粒度分析仪校准步骤详解:提升测量精度的秘诀
在材料科学、环境监测、医药研发等众多领域,激光粒度分析仪以其高精度、高效率的测量性能,成为了不可或缺的测试工具。然而,为了保持其测量结果的准确性和可靠性,定期校准是不可或缺的步骤。 接下来,佰德将为您详细介…...
独一无二的设计模式——单例模式(python实现)
1. 引言 大家好,今天我们来聊聊设计模式中的“独一无二”——单例模式。想象一下,我们在开发一个复杂的软件系统,需要一个全局唯一的配置管理器,或者一个统一的日志记录器;如果每次使用这些功能都要创建新的实例&…...
第二证券:可转债基础知识?想玩可转债一定要搞懂的交易规则!
可转债,全称是“可转化公司债券”,是上市公司为了融资,向社会公众所发行的一种债券,具有股票和债券的双重特点,投资者可以选择按照发行时约定的价格将债券转化成公司一般股票,也可作为债券持有到期后收取本…...
原型模式的实现
1. 引言 1.1 背景 在实际编程中,有时需要频繁创建多个相似但稍有不同的对象。如果采用传统的对象创建方式,容易造成代码冗余,对象重复初始化操作也可能带来大量的的资源消耗(如时间、内存等)。这样不仅降低了灵活性,导致难以适应状态的变化,还降低了代码的可扩展性。 …...
【第二套】华为 2024 年校招-硬件电源岗
1.为了避免 50Hz 的电⽹电压⼲扰放⼤器,应该⽤那种滤波器: A.带阻滤波器 B.带通滤波器 C.低通滤波器 D.⾼通滤波器 2.PID 中的 I 和 D 的作⽤分别是? A、消除静态误差和提⾼动态性能 B、消除静态误差和减⼩调节时间 C、提⾼动态性能和减⼩超调…...
Xilinx FPGA:vivado利用单端RAM/串口传输数据实现自定义私有协议
一、项目要求 实现自定义私有协议,如:pc端产生数据:02 56 38 ,“02”代表要发送数据的个数,“56”“38”需要写进RAM中。当按键信号到来时,将“56”“38”读出返回给PC端。 二、信号流向图 三、状态…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
TRS收益互换:跨境资本流动的金融创新工具与系统化解决方案
一、TRS收益互换的本质与业务逻辑 (一)概念解析 TRS(Total Return Swap)收益互换是一种金融衍生工具,指交易双方约定在未来一定期限内,基于特定资产或指数的表现进行现金流交换的协议。其核心特征包括&am…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Docker拉取MySQL后数据库连接失败的解决方案
在使用Docker部署MySQL时,拉取并启动容器后,有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致,包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因,并提供解决方案。 一、确认MySQL容器的运行状态 …...
API网关Kong的鉴权与限流:高并发场景下的核心实践
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 引言 在微服务架构中,API网关承担着流量调度、安全防护和协议转换的核心职责。作为云原生时代的代表性网关,Kong凭借其插件化架构…...
