模拟LinkedList实现的链表(无哨兵)

1.前言

我们将LinkdList视作链表, 底层设计了内部类Node类, 我这里依然没有用到泛型, 其实加上泛型依然很简单, 即将Node节点的数据域的类型由Int转换为E(<E>), 我在此不做赘述.同时实现了增删查改, 遍历等操作.

2.链表(无哨兵)的代码实现

public class LinkListTest implements Iterable<Integer>{//头指针static Node head;//内部类private static class Node{//数据域int value;//指针域Node next;public Node(int value, Node nest) {this.value = value;this.next = nest;}}//头插法public void addHead(int value) {Node p = new Node(value, null);p.next = head;head = p;}//遍历链表 : 方式1public void Traversal1() {Node p = head;while (p != null) {System.out.println("该节点的值是" + p.value);p = p.next;}}//获取指定索引位置上的节点的值public int get(int index) {Node p = findIndex(index);return p.value;}//返回指定索引的节点private Node findIndex(int index) {int count = 0;Node p = head;while (count < index) {if (p == null) {throw new IllegalArgumentException();}p = p.next;count++;}return p;}//找到尾节点private Node findLast() {//如果是空链表, 压根找不到最后的节点if (head == null) {return null;}Node p;//当p.next == null时, 则p指向了尾节点for (p = head; p.next != null; p = p.next) {;}return p;}//尾插法public void addLast(int value) {Node last = findLast();//如果是一个空链表if (last == null) {addHead(value);return;}last.next = new Node(value, null);}public void Insert(int index, int value) {//如果插入的是第一个节点if (index == 0) {addHead(value);return;}//先找到index位置处的前一个节点Node p = findIndex(index - 1);p.next = new Node(value, p.next);}//删除最后一个节点public void removeFrist() {//如果是空链表if (head == null) {throw new RuntimeException();}//找到头节点Node p = findIndex(0);head = p.next;}public void remove(int index) {//如果是空链表if (head == null) {throw new RuntimeException();}//如果要删除的是最后一个节点, 那么调用removeFrist()方法if (index == 0) {removeFrist();return;}Node p = findIndex(index - 1);p.next = p.next.next;}//使用迭代器进行遍历@Overridepublic Iterator<Integer> iterator() {return new Iterator<Integer>() {Node q = head;@Overridepublic boolean hasNext() {if (q != null) {return true;}return false;}@Overridepublic Integer next() {int value = q.value;q = q.next;return value;}};}//使用函数式接口进行链表的遍历public void Traverse2(Consumer<Integer> consumer) {for (Node p = head; p != null; p = p.next) {consumer.accept(p.value);}}}

3. 注

  • foreach循环的底层使用了迭代器.所以如果一个类的对象想要使用foreach循环遍历,则其类必须实现Iterable接口,并重写其中的抽象方法(iterable()).在其return语句中实现了匿名内部类,重写了Iterator接口的两个重要的抽象方法,hasNext()和next().不断迭代将next函数返回的值赋值给临时变量element.
  • 在Traverse2方法中,我们使用了函数式接口来进行链表的遍历.
    public void Traverse2(Consumer<Integer> consumer) {for (Node p = head; p != null; p = p.next) {consumer.accept(p.value);}}@Testpublic void test3() {LinkListTest l = new LinkListTest();l.addLast(12);l.addLast(23);l.addLast(34);l.addLast(45);l.addLast(56);l.addLast(67);l.Traverse2(value -> {System.out.println("该节点的值为" + value);});l.Traverse2(System.out :: println);}

    形参是一个消费型的函数式接口,实参我们可以传入接口的实现类的对象(lambda表达式或者方法引用实现).

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

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

相关文章

基于Promise + XHR 封装myAxios函数

在JavaScript中&#xff0c;你可以使用Promise和XMLHttpRequest&#xff08;XHR&#xff09;来封装一个名为myAxios的函数&#xff0c;用于执行HTTP请求。下面是一个简单的示例&#xff0c;它封装了GET和POST请求的基本功能&#xff1a; function myAxios(url, method GET, da…

matlab回归学习

前言 所谓回归学习即预测&#xff0c;便是由已知的数据推测未知的数据&#xff0c;利用转速与转矩来推测电流。 1、数据准备 下面虚拟一组转速转矩以及电流数据。 speed [100 220 330 440 550 660]; torque [200 300 400 500 700 900]; I [400 500 603 739 821 912]; arr …

DataGrip操作Oracle

一、创建表空间 表名任意起&#xff0c;路径自己指定 -- 创建表空间 create tablespace mydb1 -- 表名 datafile E:\Code\sql\oracle\oracle_tablespace\mydb1.dbf --指定表空间路径 size 100M --指定表空间大小 autoextend on next 50M --指定一次扩充多少mb extent managemen…

万兆以太网MAC设计(7)ARP协议报文格式详解以及ARP层模块设计

文章目录 前言&#xff1a;1、ARP协议详解2、ARP工作机制 二、ARP_RX模块设计三、ARP_TX模块设计四、ARP_table模块5、仿真5.1、发送端5.2、接收端5.3、缓存表 总结 前言&#xff1a; 1、ARP协议详解 ARP数据格式&#xff1a; 硬件类型:表示硬件地址的类型。它的值为1表示以太…

ocr文字识别软件是干什么的?

OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;文字识别软件是一种能够将图像或者扫描的文档中的文字内容转换为可编辑的文本格式的软件。它的主要功能包括&#xff1a; 1. **文字提取&#xff1a;**识别图像中的文字并提取出来&#xff0…

Android Radio实战——获取音频补丁(二十)

音频补丁是一种音频处理技术,主要通过在音频信号中加入特定的噪声或信号,来掩盖或弥补原始音频中的缺陷或不足。这种技术广泛应用于音频制作、音乐处理、语音识别等领域,旨在提高音频的质量和听感。 一、获取流程 在 Radio 开发中获取音频补丁的操作通常在 openSession 之…

spring的扩展接口

spring的扩展接口 spring提供了一些扩展接口来对spring进行定制化功能&#xff0c;可以选择如下一些扩展点&#xff1a; BeanFactoryPostProcessor beanFactory后置处理器&#xff0c;存在于容器启动阶段&#xff0c;支持在bean factory标准初始化完成后&#xff0c;对bean fac…

VMware虚拟机ens33没有IP的解决办法

1.关闭NetworkManager服务 2.systemctl stop NetworkManager 3.systemctl restart network.service 4.service network restart [rootlocalhost network-scripts]# ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 …

MAVEN的安装与配置

MAVEN的安装与配置 1 简介 1.1 什么是MAVEN? Maven是一个项目构建及管理工具&#xff0c;开发团队几乎不用花多少时间就能够自动完成工程的基础构建配置&#xff0c; Maven 使用了一个标准的目录结构在不同开发工具中也能实现项目结构的统一。Maven提供了清理&#xff0c;编…

Lambda表达式特点

Lambda 表达式是 Java 8 引入的一项重要特性&#xff0c;它们提供了一种更简洁的方式来表达匿名函数。Lambda 表达式允许你将一段代码传递给方法&#xff0c;而不是显式创建一个实现了接口的匿名内部类。Lambda 表达式通常用于实现单个抽象方法的接口&#xff08;即函数式接口&…

C# 预处理器指令详解与示例

前言 在软件开发中&#xff0c;我们常常需要编写可移植和可配置的代码。C# 预处理器指令为我们提供了这样的能力&#xff0c;它允许我们在编译代码之前进行条件编译和文本替换。在本篇文章中&#xff0c;我们将详细介绍C#预处理器指令的定义、语法格式、功能以及在实际编程中的…

javaEE初阶——多线程(九)——JUC常见的类以及线程安全的集合类

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享多线程专题的最后一篇文章:关于JUC常见的类以及线程安全的集合类 如果有不足的或者错误的请您指出! 目录 3.JUC(java.util.concurrent)常见的类3.1Callable接口3.2 RentrantLoc…

超级好看动态视频官网源码

源码介绍 超级好看动态视频引导页源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 效果截图 源码下载 超级好看动态…

Android IPC | Android多进程模式

前 言 关于Android的进程间通信&#xff08;即IPC&#xff09;有很多种方式&#xff0c;比如我们常用的AIDL、Socket等&#xff0c;而其中最重要而且最需要掌握的就是AIDL的使用和原理&#xff0c;简单来说它是通过Binder实现的。 关于Binder的知识点非常多&#xff0c;当我们…

三角函数与其他复杂函数在C语言中的实现:CORDIC算法、泰勒公式、查表法与math库详解

在C语言中实现三角函数&#xff0c;通常有四种主要方法&#xff1a;CORDIC算法、泰勒公式展开、查表法以及直接调用C语言的标准数学库。接下来我们将详细介绍这四种方法&#xff0c;并探讨其他可能的补充实现手段。 1. CORDIC算法 CORDIC&#xff08;Coordinate Rotation Dig…

MySQL数据库触发器

用途&#xff1a;订单表table01&#xff0c;运单表table02。 首先有订单表有记录/但是刚开始只有订单号/没有运单号&#xff1b; INSERT INTO testdb.table01 (id, orderid, transportid) VALUES(4, order04, ); 然后运单表有记录/记录有运单号。 INSERT INTO testdb.table…

【2024中高级向】22道前端面试题附答案

以下是问题总览&#xff1a;不会的点击右侧目录对应的问题即可跳转到答案 webpack 中 chunkHash 与 contentHash 区别&#xff1b;写过 webpack 的 loader 和 plugin 么&#xff1b;webpack 处理 image 是用哪个 loader&#xff0c;限制成 image 大小的是哪个&#xff1f;webp…

你如何看待AIGC技术?

你如何看待AIGC技术&#xff1f; AIGC技术&#xff08;Artificial Intelligence Generated Content&#xff09;是指由人工智能生成的内容。它在许多领域都有应用&#xff0c;包括自然语言处理、图像生成、音频合成等。虽然这些技术可以提高效率和创造力&#xff0c;但也需要注…

用C#写一个读取pdf文档内容的库

安装这两个库&#xff0c;第二个库一定要安装否则有些pdf文件读取会出现异常 读取 using iText.Kernel.Pdf; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Listener;namespace TestReadPdf {public static class PdfHelper{public static IE…

军工单位安全内网文件导出,怎样做到严密的安全管控?

军工单位是指承担国家下达的军事装备、产品研制、生产计划任务的企、事业单位&#xff0c;主要包括电子工业部、航空工业总公司、航天工业总公司、兵器工业总公司、核工业总公司、船舶工业总公司、中国工程物理研究院及各省国防工业办公室等。 军工单位的特点主要体现在以下几个…