Java数据结构4(自己实现简单LinkedList)

Java中ArrayList与LinkedList的简单实现 数据结构 阅读详情

目录

一,简单介绍链表

二,自己实现单项非循环链表

一,链表

链表也是存储数据的一种,跟ArrayList不一样,ArrayList是跟数组一样物理与逻辑都是连续的,但是链表就和火车一样,每一个数据之间都有相关的引用将数据连接起来,就如下面这张图,通过引用下一个数据的地址来进行连接

二,自己实现单项非循环链表

主要方法为增删查改,链表里面的删除主要是改变指向

这是我们定义的每一个小节点,里面有数据val以及next指向,来指向下一个数据,让每一个数据串联起来,以及前一个数据prev,第一个数据head,最后一个数据last

public class MyLinkedList {
    static class ListNode{
        public int val;
        public ListNode prev;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
    public ListNode head;
    public ListNode last;
    //头插法
    public void addFirst(int data){
        ListNode listNode=new ListNode(data);
        if (head==null){
            head=listNode;
            last=listNode;
        }else {
            listNode.next=head;
            head.prev=listNode;
            head=listNode;
        }
    }
    //尾插法
    public void addLast(int data){
        ListNode listNode=new ListNode(data);
        if(head==null){
            head=listNode;
            last=listNode;
        }else {
            listNode.next=null;
            listNode.prev=last;
            last.next = listNode;
            last=listNode;
        }
    }
    //任意位置插⼊,第⼀个数据节点为0号下标
    public void addIndex(int index,int data){
        ListNode listNode=new ListNode(data);
        if (index<0 || index>size()){
            System.out.println("位置错误");
            return;
        }
        //特殊位置处理
        if(index == 0) {
            addFirst(data);
            return;
        }
        if(index == size()) {
            addLast(data);
            return;
        }
        ListNode cur=searchIndex(index);
        listNode.next=cur;
        cur.prev.next = listNode;
        listNode.prev = cur.prev;
        cur.prev = listNode;
    }
    //通过位置去找数据
    private ListNode searchIndex(int index){
        int count=0;
        ListNode cur=head;
        if (index<0 || index>size()-1){
            System.out.println("位置错误");
            return null;
        }
        while (cur!=null){
            count++;
            cur=cur.next;
            if (count==index){
                return cur;
            }
        }
        return null;
    }
    //查找是否包含关键字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) {
            return;
        }
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                if (cur == head) {
                    //删除的节点是头节点
                    head = head.next;
                    if (head != null) {
                        //防止 当前双向链表 只有1个节点
                        head.prev = null;
                    }
                }else {
                    cur.prev.next=cur.next;
                    if (cur.next==null){
                        last=last.prev;
                    }
                    cur.next.prev=cur.prev;
                }
                return;
            }
            cur=cur.next;
        }
    }
        //删除所有值为key的节点
    public void removeAllKey(int key){
        if (head == null) {
            return;
        }
        ListNode cur = head;
        while (cur != null) {
            if (cur.val == key) {
                if (cur == head) {
                    //删除的节点是头节点
                    head = head.next;
                    if (head != null) {
                        //防止 当前双向链表 只有1个节点
                        head.prev = null;
                    }
                } else {
                    cur.prev.next = cur.next;
                    if (cur.next == null) {
                        last = cur.prev;
                    } else {
                        cur.next.prev = cur.prev; // 只有非尾节点才执行!
                    }
                }
            }
            cur = cur.next;
        }
    }
    //得到单链表的⻓度
    public int size(){
        int count = 0;
        ListNode cur = head;
        while (cur != null) {
            count++;
            cur = cur.next;
        }
        return count;
    }
    //全部清除
    public void clear() {
        head=null;
    }
    //打印
    public void display() {
        ListNode cur=head;
        while (cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }
        System.out.println();
    }

}

java 集合框架-利用LinkedList实现堆栈数据结构 /* 利用LinkedList来实现队列(先进先出)和堆栈(先进后出) 堆栈:后进先出 队列:先进先出 */ import java.util.*; /*队列:将LinkedList进行封装,实现队列先进先出的功能特点*/ class Duilie { private LinkedList link; Duilie() { link=new LinkedList(); 阅读详情

相关推荐

Java LinkedList 在状态机实现中的应用

本文的目的是深入讲解如何利用 Java 的 LinkedList 来实现状态机。我们将涵盖状态机和 LinkedList 的基本概念、它们之间的关系,以及通过具体的代码实例展示如何运用 LinkedList 完成状态机的搭建。同时,我们还会探讨这种实现方式在实际场景中的应用,以及未来可能面临的发展趋势和挑战。本文首先会介绍状态机和 LinkedList 的核心概念,以及它们之间的联系。然后详细讲解使用 LinkedList 实现状态机的算法原理和具体操作步骤,包括数学模型和公式。

Java大师兄的博客 719

【java-数据结构篇】揭秘 Java LinkedList:链表数据结构的 Java 实现原理与核心概念

LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引⽤将节点连接起来了,因此在在任意位置插⼊或者删除元素时,不需要搬移元素,效率⽐较⾼。链表是一种通过指针将数据节点连接起来的数据结构,链表是⼀种物理存储结构上⾮连续存储结构,数据元素的逻辑顺序是通过链表中的引⽤链接次序实现的。但是如果要在指定节点之前插入新节点,需要先遍历链表找到该节点的前驱节点,这会比较复杂,尤其是在没有额外的头节点辅助的情况下。的底层是一个双向链表,由节点(Node)组成。

2301_80350265学无止尽5的博客 8658

读书笔记 | 财务会计理论(第7版 William R.Scott)(中):契约视角下的会计信息价值

本文从契约理论视角深入剖析了财务会计信息的核心价值。文章指出,会计信息作为关键的“契约润滑剂”,通过债务合同与薪酬合同等具体形式,有效解决了公司内外的信息不对称与道德风险问题,协调了股东、债权人及管理层等多方利益,是公司治理与资本市场有效运转的基石。

mac99的博客 331

【数据结构】LinkedList原理及实现学习总结

LinkedList 和 ArrayList 一样,都实现了 List 接口,但其内部的数据结构有本质的不同。LinkedList 是基于链表实现的(通过名字也能区分开来),所以它的插入和删除操作比 ArrayList 更加高效。但也是由于其为基于链表的,所以随机访问的效率要比 ArrayList 差。二、ListedList类定义public class Lin

简约人生的博客 3万+

Python实现课程时间表

用Python实现课程表功能

life is like a play 2042

高等数学/概率论/数理统计/线性代数/离散数学面试-核心概念-问题理解

特征值与特征向量是线性代数中的概念,它们与线性变换有关。在线性变换中,如果存在非零向量 v ,使得当该向量通过变换后,其方向不变,只是长度发生了变化,那么这个向量 v 就是特征向量。而这个长度变化的比例因子,即变换前后向量长度的比值,称为特征值。数学公式表示:通俗易懂的解释:想象一下,你有一个可以伸缩的橡皮筋,这个橡皮筋可以代表一个向量。现在,你有一个特殊的机器,它可以改变橡皮筋的形状,但不会改变它延伸的方向。当你把橡皮筋放入机器中,机器会拉伸或压缩橡皮筋,但橡皮筋的方向保持不变。

m0_64198455的博客 2293

[数据结构] LinkedList

摘要:LinkedList是Java集合框架中的双向链表实现,具有高效的插入/删除操作(O(1))但随机访问性能较差(O(n))。它实现了List和Deque接口,支持头尾操作和双向遍历。与ArrayList相比,LinkedList更适合频繁增删场景,而ArrayList更适合随机访问。文章详细介绍了LinkedList的特性、常用方法、四种遍历方式,并通过模拟实现展示了其双向链表的底层结构。最后对比了LinkedList和ArrayList在存储结构、访问效率和应用场景上的差异。

Boop_wu的博客 1123

矢量网络分析仪VNA的校准之SOLT方法

作者:杭州冥鸿电子科技有限公司 邮箱:huanglong@deepelec.com S参数的测量方法有两种,一种是基于扫频测量的原理(VNA),另外一种是基于快沿阶跃响应的原理(TDR)。 下图是VNA的原理框图,主要包括以下部分: (1)激励信号源:提供感兴趣的频率范围内的入射信号; (2)信号分离装置:含功分器和定向耦合器,分离出入射,反射和传输信号; (3)接收机:...

u010018619的博客 2万+

【数据结构】链表与LinkedList

链表~

做梦都想要三十万年薪~ 2734

无人机通信安全渗透测试:从信号拦截到GPS欺骗的完整攻防框架

在物联网和智能设备普及的背景下,无线通信安全成为关键基础设施防护的核心环节。其原理在于,通过软件定义无线电等设备对空中的射频信号进行捕获、分析与模拟,从而评估通信协议在加密、认证和防重放等方面的脆弱性。这项技术的价值在于,它能主动发现并修复系统设计缺陷,避免因信号被拦截或欺骗导致设备被劫持、数据泄露等重大安全事件。其应用场景广泛,涵盖消费电子、工业控制及关键基础设施等领域。本文聚焦于无人机这一典型移动物联网终端,深入探讨如何构建一套针对其通信链路的渗透测试方法论,其中涉及信号拦截、协议逆向等关键技术,旨在为

weixin_34128237的博客 392

使用 MATLAB/Simulink 来构建一个基于多能互补的微电网储能系统模型

【摘要】本文详细介绍了基于MATLAB/Simulink的多能互补微电网储能系统建模方法。教程涵盖光伏发电、风力发电、电池储能和负荷模块的搭建,重点讲解了能量管理系统(EMS)的调度策略实现。通过设置传感器监测关键参数,并采用固定步长离散求解器进行仿真,分析了系统在动态工况下的响应特性,包括发电-负荷平衡、储能状态变化及系统稳定性等指标。该建模方法为多能互补微电网的设计与优化提供了有效工具,对提升可再生能源利用效率具有实践指导意义。

MHD0815的博客 191

Java 中数据结构LinkedList的用法

LinkedList

yusude123456的博客 3265

【面试系列】软件架构师 高频面试题及详细解答

本文介绍了软件架构师岗位的初级、中级和高级面试题及详细解答,涵盖了系统设计、面向对象设计、分布式系统、云计算技术、性能优化等关键领域。通过这些问题和解答,候选人可以深入理解软件架构师的核心职责和技能要求。此外,文章总结了在面试中需要掌握的常考知识点,包括架构模式、分布式系统管理、安全性、数据管理和DevOps实践。通过掌握这些知识点,软件架构师能够有效设计和指导复杂系统的结构,确保系统的可扩展性、性能和维护性。

在路上的专栏 852

Java 【数据结构】 LinkedList【神装】

说明LinkedList是Java中提供的双向链表实现的数据结构。它实现了List接口,因此可以像操作普通的列表一样对其进行操作,同时也支持队列和栈的操作。与ArrayList相比,LinkedList在插入和删除元素时具有更好的性能,因为它不需要移动其他元素。但是在访问特定位置的元素时,LinkedList的性能较差,因为需要从头或尾开始遍历链表。总的来说,LinkedList适合频繁进行插入和删除操作的场景。注意LinkedList实现了List接口LinkedList。

2302_79806056的博客 1907

Windows版,vcenter 6.0 STS 证书更新--Vcenter 6.0 windows 版,没有-set_signing_cert 替换参数

Windows版,vcenter 6.0 STS 证书手动更新

技术是手段,服务才是目的。开源与协作是创新的活水,而核心技术的自主可控是立足之本。身处黄金时代,唯持续学习,方能不惧变化。从使用者到创造者,中国技术的未来,正待你们接过火炬,走得更远、更稳、更好。 678

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java数据结构之LinkedList

优点缺点插入/删除效率高(O(1),已知位置)随机访问效率低(O(n))尾部添加无需扩容内存占用高(每个节点有指针)支持双向遍历(不适合频繁随机访问的场景考点答案底层结构双向链表随机访问性能O(n)(需遍历)插入/删除性能O(1)(已知位置)内存占用高(每个节点有指针)与 ArrayList 的区别链表 vs 数组,插入删除 vs 随机访问线程安全否,需用或fail-fast 机制与 ArrayList 一致,迭代时修改会抛异常适用场景。

m0_75236543的博客 862

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

【Java & 数据结构】LinkedList介绍

回答这个问题前, 首先我们需要了解一下这个头节点是干什么的. 这个头节点实际上和寻常的节点没有什么两样, 但是它的数据域, 是不存储真正的数据的, 你可以在这个数据域中存储任意的数据, 例如存储链表的长度, 或者根本不使用这个数据域都是可以的. 它的作用就是用于作为链表的头, 便于链表的操作和管理而设计的.首先我们要想这个节点和链表是什么关系?很明显如果要插入一定要前一个位置的引用, 因为要令其 next 指向当前节点, 因此我们需要找到前一个节点. 那么我们如何找到前一个节点呢?

qq_42150700的博客 1500

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

LinkedList数据结构

LinkedList动态大小LinkedList的大小可以动态调整,不需要预定义容量。双向链表LinkedList的节点包含前后指针,能够高效地进行插入和删除操作。有序集合:与ArrayList一样,LinkedList保留插入顺序。允许重复元素LinkedList支持存储重复的元素。线程不安全LinkedList是非线程安全的,需要手动同步。LinkedList是一种常用的数据结构,它采用了链表的方式来存储数据。

Flying_Fish_roe的博客 1135

Java数据结构——LinkedList

摘要:本文介绍了LinkedList链表结构及其实现。第一部分讲解链表的概念和结构,重点分析无头双向循环链表的Java实现,包括头插法、尾插法、任意位置插入等基本操作。第二部分介绍Java中LinkedList的使用方法,包括构造方法、常用操作和三种遍历方式(for-each、正向迭代器、反向迭代器)。与ArrayList相比,LinkedList更适合频繁插入删除的场景,因其底层采用链表结构,操作时间复杂度更低。

Yoko_999的博客 940

【JAVA-数据结构】LinkedList与链表

LinkedList 的官方文档LinkedList的底层是双向链表结构(链表后面介绍),由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高【说明】1. LinkedList实现了List接口2. LinkedList的底层使用了双向链表3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问。

Mr_star_galaxy的博客 1208

认真研究Java集合之LinkedList的实现原理

LinkedList同时实现了List接口和Deque对口,也就是它既可以看作一个顺序容器,又可以看作一个队列(Queue),同时又可以看作一个栈(stack)。 ```java public class LinkedList extends AbstractSequentialList implements List, Deque, Cloneable, java.io.Serializable //... } ``` 当你需要使用栈或者队列时,可以考虑用L............

小小默:进无止境 3699

Java基础--LinkedList类实现链表

Java基础,链表基础,LinkedList类实现链表。

weixin_67679565的博客 1176

java数据结构之:ArrayList与LinkedList详解

前篇博文讲到了Java底层怎么知道ArrayList和LinkedList哪个是随机访问哪个是顺序访问的,本片博文主要介绍各自的数据特点。 ArrayList: 从他的这个构造函数我们可以知道他的底层实现就是一个Object对象数组。 第二个构造函数构造一个空的list默认长度为10 第三个构造函数构造一个包含特定collection集合的list 接下来看一看add方法: ...

qq_20054391的博客 3092

Java LinkedList 详解

Java LinkedList 详解

T_Y_F_的博客 1577

【数据结构】LinkedList ------ java实现

知识框架图:LinkedList是一种常用的数据结构。底层是一个双向链表。每个节点包含数据以及指向前一个节点和后一个节点的引用。

C384136844的博客 1590

LinkedList数据结构,重写一个简单的LinkedList数据结构

java中的LinkedList是一种双向链表式的数据结构,什么是双向链表,就是集合中每个节点都存储了指向当前节点的上一个节点的引用和下一个节点的引用,LinkedList是没有下标的概念的,所以不能像数组和ArrayList一样随机访问数据,只能通过节点里指向下一个节点的引用一个一个往下找,但是在插入数据的时候只需要更改要插入位置的上一个节点里指向下一个节点的引用和下一个节点里指向上一个节点的引...

sipengfei_的博客 299
上一篇: Java数据结构3(ArrayList与顺序表)
下一篇: Java数据结构5(栈)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值