无脑入单向无头链表的实现| ArrayList和LinkedList的区别

1. ArrayList的缺陷

上节课已经熟悉了ArrayList的使用,并且进行了简单模拟实现。通过源码知道,ArrayList底层使用数组来存储元素。

由于其底层是一段连续空间,当 ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后 搬移,时间复杂度为 O(n) ,效率比较低,因此 ArrayList 不适合做任意位置插入和删除比较多的场景 。因此: java集合中又引入了LinkedList ,即链表结构。

2. 链表

2.1 链表的概念及结构

链表也是线性表的一种,链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:  

1. 单向或者双向

2. 带头或者不带头 

3. 循环或者非循环 

虽然有这么多的链表的结构,但是我们重点掌握两种: 

  1. 无头单向非循环链表结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。
  2. 无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。

2.2 无头单向非循环链表实现

2.2.1 链表的类结构

2.2.2 头插法

2.2.3尾插法

2.2.4在index前面插入

2.2.5查找是否包含关键字key是否在单链表当中

 

2.2.6删除第一次出现关键字为key的节点

2.2.7删除所有出现关键字为key的节点

 2.2.8得到单链表的长度

2.2.9释放链表

2.2.10节点打印 

2.2.11得到节点长度

 

3.单向无头链表实现代码 

MyLinkedList类

import java.util.Arrays;public class SingleLinkedList {static class ListNode {public int val;public ListNode next;public ListNode(int val) {this.val = val;}}//记录头节点public ListNode head;//头插法public void addFirst(int data) {ListNode node = new ListNode(data);
//        //更为简单的方式
//        node.next = head;
//        head = node;if (head == null) {head = node;} else {node.next = head;head = node;}}//尾插法public void addLast(int data) {ListNode node = new ListNode(data);//如果链表为空,直接插入if (head == null) {head = node;} else {//如果链表不为空ListNode cur = head;while (cur.next != null) {cur = cur.next;}cur.next = node;}}//任意位置前插入,第一个数据节点为0号下标public void addIndex(int index, int data) {//1.判断index的合法性try {checkIndex(index);} catch (IndexNotLegalException e) {e.printStackTrace();}//第一个节点if (index == 0) {//直接头插addFirst(data);} else if (index == size()) {//尾节点,直接尾插addLast(data);} else {//插入中间节点ListNode newNode = new ListNode(data);ListNode listNode = findIndexSubOne(index);newNode.next = listNode.next;listNode.next = newNode;}}//判断index的合法性private void checkIndex(int index) throws IndexNotLegalException {if (index < 0 || index > size()) {throw new IndexNotLegalException("index不合法");}}//查找index的前一个节点private ListNode findIndexSubOne(int index) {int count = 0;ListNode cur = head;while (count != index - 1) {cur = cur.next;count++;}return cur;}//查找是否包含关键字key是否在单链表当中public boolean contains(int key) {ListNode cur = head;while (cur != null) {if (cur.val == key) {return true;}cur = cur.next;}return false;}//删除第一次出现关键字为key的节点public void remove(int key) {if(head == null){System.out.println("没有节点,删除失败!");return;}ListNode cur = head;//头结点是keyif (head.val == key) {head = head.next;System.out.println("删除成功!");return;}while (cur.next != null) {if (cur.next.val == key) {cur.next = cur.next.next;System.out.println("删除成功!");return;}cur = cur.next;}System.out.println("删除失败!没有此节点");}//删除所有值为key的节点public void removeAllKey(int key) {//1. 判空if(this.head == null) {return;}//2. 定义prev 和 curListNode prev = head;ListNode cur = head.next;//3.开始判断并且删除while(cur != null) {if(cur.val == key) {prev.next = cur.next;}else {prev = cur;//prev = prev.next;}cur = cur.next;}//4.处理头节点if(head.val == key) {head = head.next;}System.out.println("删除成功!");}//得到单链表的长度public int size() {ListNode cur = head;int count = 0;while (cur != null) {count++;cur = cur.next;}return count;}//释放链表public void clear() {
//        //直接释放
//        head = null;//安全释放ListNode cur = head;while (cur != null) {ListNode curN = cur.next;//cur.val = null;cur.next = null;cur = curN;}head = null;}//节点打印public void display() {ListNode cur = head;while (cur != null) {System.out.print(cur.val + " ");cur = cur.next;}System.out.println();}
}

Test测试类

public class Test {public static void main(String[] args) {SingleLinkedList singleLinkedList = new SingleLinkedList();//头插法
//        singleLinkedList.addFirst(1);
//        singleLinkedList.addFirst(2);
//        singleLinkedList.addFirst(3);
//        //尾插法测试
//        singleLinkedList.addLast(1);
//        singleLinkedList.addLast(1);
//        singleLinkedList.addLast(1);singleLinkedList.addLast(3);singleLinkedList.addLast(2);singleLinkedList.addLast(3);singleLinkedList.addLast(3);singleLinkedList.addLast(5);//        //任意位置插入测试
//        singleLinkedList.addIndex(0,5);
//        //是否含有此元素测试
//        System.out.println(singleLinkedList.contains(3));
//        singleLinkedList.remove(3);singleLinkedList.removeAllKey(3);singleLinkedList.display();System.out.println(singleLinkedList.size());}
}

IndexNotLegalException运行时异常类

public class IndexNotLegalException extends RuntimeException{//无参构造方法public IndexNotLegalException() {}//含一个参数参构造方法public IndexNotLegalException(String message) {super(message);}
}

好啦,今天就到这里了,我们下期再见,感谢观看。

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

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

相关文章

掼蛋入门口诀

1、有王打单张&#xff0c;无王打一夯 2、想使坏&#xff0c;三不带 3、情况不明&#xff0c;对子先行 4、两个小单张&#xff0c;不打不健康 5、顺子打到头&#xff0c;对手没想头 6、双贡出单张&#xff0c;头游响当当 7、逢五出两张&#xff0c;逢六出三张 8、炸五不炸四&am…

pytest测试基础

assert 验证关键字 需要pahton版本大于3.6&#xff0c;因为有个工具pip3;因为做了映射&#xff0c;所以下面命令pip3即pip pip install -U pytest -U参数可选&#xff0c;是如果已安装可更新。 如果上述demo变化 通过验证代码&#xff0c;测试环境没问题。…

详细谈电脑ip、域名、内网、外网、localhost、127.0.0.1、网关等通讯基础知识(易懂)

1. ip地址与域名的定义以及其关系 ip地址的定义&#xff1a; IP地址&#xff08;Internet Protocol Address&#xff09;是指互联网协议地址&#xff0c;又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式&#xff0c;它为互联网上的每一个网络和每一台主机分配一…

ChatGPT记忆功能终于上线了, OpenAI 官方:用得越久越聪明!

原文 ChatGPT记忆功能终于上线了, OpenAI 官方&#xff1a;用得越久越聪明&#xff01; Aitrainee | 公众号&#xff1a;AI进修生 &#x1f31f; 记得今年2月份OpenAI发布过ChatGPT上线记忆功能的消息&#xff0c;我记得当时还弹出过这个窗口给我&#xff0c;但是仅仅体验了几…

Git--分布式版本控制系统

目录 一、理解分布式版本控制系统二、远程仓库三、克隆远程仓库四、向远程仓库推送五、拉取远程仓库六、配置Git七、给命令配置别名八、创建标签九、操作标签 一、理解分布式版本控制系统 我们⽬前所说的所有内容&#xff08;⼯作区&#xff0c;暂存区&#xff0c;版本库等等&a…

在智慧城市的建设中智能电表发挥什么作用

在智慧城市的建设中&#xff0c;智能电表扮演着至关重要的角色。智慧城市是一个利用信息技术手段提升城市运行效率和质量的新型城市模式&#xff0c;旨在通过信息和通信技术的应用&#xff0c;提高城市管理、公共服务、环境保护等方面的质量和效率&#xff0c;促进城市的可持续…

基于MSP430F249的电子钟仿真(源码+仿真)

目录 1、前言 2、仿真 3、程序 资料下载地址&#xff1a;基于MSP430F249的电子钟仿真(源码仿真&#xff09; 1、前言 基于MSP430F249的电子钟仿真&#xff0c;数码管显示时分秒&#xff0c;并可以通过按键调节时间。 2、仿真 3、程序 #include <MSP430x24x.h> #def…

搭建Springboot Admin 服务端和客户端

Spring Boot Admin 是一个网络应用程序&#xff0c;用于管理和监控 Spring Boot 应用程序。每个应用程序都被视为客户端&#xff0c;并向管理服务器注册。在幕后&#xff0c;Spring Boot Actuator 端点发挥着神奇的作用。 一、搭建Springboot Admin服务端 新建一个Maven模块&a…

短视频账号矩阵系统===4年技术源头打磨

短视频矩阵系统技术源头打磨需要从多个方面入手&#xff0c;以下是一些建议&#xff1a; 1. 基础技术研发&#xff1a;不断投入资金和人力进行基础技术研发&#xff0c;包括但不限于视频处理、人工智能、大数据等技术&#xff0c;以提高短视频矩阵系统的性能和稳定性。 2. 优化…

03-JAVA设计模式-策略模式

策略模式 什么是策略模式 策略模式&#xff08;Strategy Pattern&#xff09;是行为设计模式之一&#xff0c;它使你能在运行时改变对象的行为。在策略模式中&#xff0c;一个类的行为或其算法可以在运行时更改。这种类型的设计模式属于行为模式。 在策略模式中&#xff0c;…

如何瓜分1.35亿美元的园艺市场?赛盈分销圈货活动即将开启!

庭院一直以来是欧美国家大多数家庭的重要使用场景&#xff0c;尤其在每年夏季都会进行庭院爆改。 人们通过修剪草坪、花草种植、庭院装饰、野营烧烤等形式增添户外庭院另一种更加休闲、新颖的生活方式。 Google Trends预测到2035年全球居家园艺市场达到1.35万亿美元&#xff0c…

500强企业如何打造高效的差旅供应链?

在构建差旅管理平台的过程中&#xff0c;很多企业差旅管理负责人常常面临一个关键问题&#xff1a;差旅供应链怎么搭建&#xff1f; 企业差旅供应链的建设是一个复杂的系统工程&#xff0c;涉及多个方面&#xff0c;包括但不限于供应商的选择与管理、技术平台的搭建、流程设计、…

Docker资源控制管理

目录 一.CPU 资源控制 1.定义 2.cgroups四大功能 &#xff08;1&#xff09;资源限制&#xff1a;可以对任务使用的资源总额进行限制 &#xff08;2&#xff09;优先级分配&#xff1a;通过分配的cpu时间片数量以及磁盘IO带宽大小&#xff0c;实际上相当于控制了任务运行优…

pycharm-ieda-phpstorm超级好用插件,一键解释代码

功能&#xff1a;解释你看不懂的代码 当你在写python和Java代码的时候&#xff0c;总有你看不懂的代码&#xff0c;怎么办&#xff1f;csdn搜&#xff1f;那不麻烦&#xff0c;直接插件解决。 来安装&#xff1a;文件-设置 点击插件-Marketplace-搜索通义灵码 安装完成后&…

GitHub介绍,GitHub如何订阅充值?

一、GitHub介绍 GitHub是一个面向开源及私有软件项目的托管平台&#xff0c;因为只支持git 作为唯一的版本库格式进行托管&#xff0c;故名Github。 GitHub于2008年4月10日正式上线&#xff0c;除了git代码仓库托管及基本的Web管理界面以外&#xff0c;还提供了订阅、讨论组、…

Windows系统引导重建,Windows引导损坏修复

Windows系统引导重建 引导是一个非常**「脆弱」的东西&#xff0c;对系统、分区**的操作都有可能导致其出现问题。 比如分区操作不当、不小心格式化某个分区、误删看不懂的文件&#xff0c;这与你用什么软件操作无关。 而引导只要出现问题&#xff0c;你的电脑就无法进入系统…

go语言通过TCP协议实现聊天室样例

目录 1、服务端&#xff1a; 2、客户端&#xff1a; 3、实现效果 1、服务端&#xff1a; package mainimport ("fmt""net""sync" )type ChatServer struct {clients map[string]net.ConnclientsMux sync.Mutex }func NewChatServer() *Ch…

功能测试_分类_用例_方法

总结 测试分类 按阶段分类 是否查看源代码分类 是否运行分类 是否自动化 其他分类 软件质量模型 开发模型-瀑布模型 测试过程模型 v w 测试用例八大要素 用例编号 用例标题 …

【delphi 】常用资源网站

在Delphi的日常开发中&#xff0c;经常会用到第三方资源&#xff0c;本文收集的是开源的资源&#xff0c;建议收藏&#xff0c;以备不时之需&#xff01; 目录 一、通用资源 1. JCL 2. JVCL 3. Alcinoe (mirror at GH) 4. Fundamentals Code Library 5. Spring4D 6. The…

装饰器模式【结构型模式C++】

1.概述 装饰器模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 2.结构 抽象构件&#xff08;Component&#xff09;角色&#xff1a;定义一个抽象接口以规范准备接收附加责任的对象。具体构件&#xff08;Concre…