Java写数据结构--单向无头非循环链表

数据结构:链表(单向无头非循环) 1 链表的概念及结构 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 链表的结构 链表就是一个个的节点组成的,一个节点分为两部分(val和next),val用来保存数据,叫做数据域,而next用来保存下一个节点的地址,节点与节点之间连接就是靠next。 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 单向、双向 带头、不带头 循环、非循环 而我将描叙的是单向无头非循环链表和双向无头非循环链表,这篇文章先讲单向无头非循环链表. 阅读详情

什么是链表?

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

从上图可以看出来,链式结构在逻辑上是连续的,但是在物理上不一定连续

链式中的节点一般都是在堆中申请出来的

从堆上申请出来的空间,是按照一定策略来分配的,两次申请出来的空间可能连续,也可能不连续

 链表分了很多种:

不带头 单向  非循环 链表

不带头 单项  循环   链表

不带头 双向 非循环 链表

不带头 双向 循环  链表

带头 单向  非循环 链表

带头 单项  循环   链表

带头 双向 非循环 链表

带头 双向 循环  链表

一共八种,本篇文章主要说到不带头 单项 非循环链表 这种也是最常见的

本篇文章主要对下列接口中的方法进行实现,文章末有全部代码

public interface Ilist {
    //头插法
    public void addFirst(int date);
    //尾插法
    public void addLast(int date);
    //任意位置插入,第一个节点为0号下标
    public void addIndex(int index, int date);
    //删除第一次出现值为key的节点
    public void remove(int key);
    //判断链表中是否存在值为key的节点
    public boolean contains(int key);
    //删除所有值为key的节点
    public void removeAllKey(int key);
    //获得链表的长度
    public int size();
    //清空链表
    public void clear();
    //显示链表
    public void disPlay();
}

先创建一个链表类实现Ilist接口

public class MySingleList implements Ilist{
    //内部类
    static class ListNode{
        public int val;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }
    //链表的头
    public ListNode head;

    //创建链表
    public void creatList(){
        ListNode node1 = new ListNode(5);
        ListNode node2 = new ListNode(6);
        ListNode node3 = new ListNode(8);
        ListNode node4 = new ListNode(10);
        ListNode node5 = new ListNode(15);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        this.head = node1;
    }

    @Override
    public void addFirst(int date) {
        
    }

    @Override
    public void addLast(int date) {

    }

    @Override
    public void addIndex(int index, int date) {

    }

    @Override
    public void remove(int key) {

    }

    @Override
    public boolean contains(int key) {
        return false;
    }

    @Override
    public void removeAllKey(int key) {

    }

    @Override
    public int size() {
        return 0;
    }

    @Override
    public void clear() {

    }

    @Override
    public void disPlay() {

    }

    
   
}

接下来对重写的方法由简单到复杂一一实现

完成disPlay方法

 @Override
    public void disPlay() {
        ListNode cur = head;
        while(cur != null){
            System.out.print(cur.val + " ");
            cur = cur.next;
        }

为了防止调用完一次函数head的指向会发生变化,所以要对head临时拷贝一份

完成size方法

@Override
public int size() {
    int len = 0;
    ListNode cur = head;
    while(cur != null){
        len++;
        cur = cur.next;
    }
    return len;
}

下面是cur的指向轨迹

实现addFirst方法

@Override
    public void addFirst(int date) {
         //创建出新的节点
        ListNode node = new ListNode(date);
        node.next = head;
        head = node;
}

测试一下

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.creatList();

        int ret = mySingleList.size();
        System.out.println(ret);

        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(8);
        mySingleList.disPlay();
        System.out.println();
    }
}

 

addLast也是同理

 @Override
    public void addLast(int date) {
        ListNode node = new ListNode(date);
        ListNode cur = head;
        while(cur.next != null){
            cur = cur.next;
        }
        cur.next = node;
    }

测试一下

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.creatList();

        int ret = mySingleList.size();
        System.out.println(ret);

        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(8);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addLast(20);
        mySingleList.disPlay();
        System.out.println();
}
}

实现addIndex方法

@Override
    public void addIndex(int index, int date) {
        int len = size();
        if(index < 0 || index > len){
            System.out.println("index位置不合法");
            return;
        }
        if(index == 0){
            addFirst(date);
        }
        if (index == len){
            addLast(date);
        }
        ListNode cur = head;
        while( index - 1 != 0 ){
            cur = cur.next;
            index--;
        }
        ListNode node = new ListNode(date);
        node.next = cur.next;
        cur.next = node;
    }

因为是单向链表,cur要指向index下标的前一个位置的节点,对index前面那个节点的next修改,进行插入

测试一下

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.creatList();

        int ret = mySingleList.size();
        System.out.println(ret);

        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(8);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addLast(20);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addIndex(2,66);
        mySingleList.disPlay();
        System.out.println();
}
}

实现contains方法

@Override
    public boolean contains(int key) {
        ListNode cur = head;
        while(cur != null){
            if(cur.val == key){
                return true;
            }
            cur = cur.next;
        }
        return false;
    }

这个很好理解

测试↓

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.creatList();

        int ret = mySingleList.size();
        System.out.println(ret);

        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(8);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addLast(20);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addIndex(2,66);
        mySingleList.disPlay();
        System.out.println();

        boolean ret2 = mySingleList.contains(66);
        System.out.println(ret2);
}
}

实现remove方法

@Override
    public void remove(int key) {
        if(head == null){
            return;
        }
        if(head.val == key){
            head = head.next;
            return;
        }
        ListNode cur = findNodeIndex(key);
        if(cur != null){
            cur.next = cur.next.next;
        }else{
            System.out.println("没有要删除的key值");
            return;
        }
    }
    //供remove使用的方法
    private ListNode findNodeIndex(int key){
        ListNode cur = head;
        while(cur.next != null){
            if(cur.next.val == key){
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }

测试 

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.creatList();

        int ret = mySingleList.size();
        System.out.println(ret);

        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(8);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addLast(20);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addIndex(2,66);
        mySingleList.disPlay();
        System.out.println();

        boolean ret2 = mySingleList.contains(66);
        System.out.println(ret2);

        mySingleList.remove(66);
        mySingleList.disPlay();
        System.out.println();
}
}

 

实现removeAllKey方法

@Override
    public void removeAllKey(int key) {
        if(head == null){
            return;
        }
        ListNode prev = head;
        ListNode cur = head.next;

        while(cur != null){
            if(cur.val == key){
                prev.next = cur.next;
                cur = cur.next;
            }else{
                prev = cur;
                cur = cur.next;
            }
        }
        if(head.val == key){
            head = head.next;
        }

    }

 

测试一下

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.creatList();

        int ret = mySingleList.size();
        System.out.println(ret);

        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(8);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addLast(20);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addIndex(2,66);
        mySingleList.disPlay();
        System.out.println();

        boolean ret2 = mySingleList.contains(66);
        System.out.println(ret2);

        mySingleList.remove(66);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(9);
        mySingleList.addIndex(1,9);
        mySingleList.addIndex(2,9);
        mySingleList.addIndex(5,9);
        mySingleList.disPlay();
        System.out.println();
        
        mySingleList.removeAllKey(9);//removeALLKey
        
        mySingleList.disPlay();
        System.out.println();
}
}

 

 只看后两行,把9都删除了

实现clear方法

 

 @Override
    public void clear() {
        head = null;
    }

这种方法简单,但是会造成内存泄漏,需要将节点的每一个next值都置为null ,需要下面这种方法

 @Override
    public void clear() {
        ListNode cur = head;
        while(cur != null){
            ListNode curN = cur.next;
            cur.next = null;
            cur = curN;
        }
        head = null;
    }

这种类似于交换两个变量的数值,需要临时拷贝一份

下面是测试类的全部代码

public class Test {
    public static void main(String[] args) {
        MySingleList mySingleList = new MySingleList();
        mySingleList.creatList();

        int ret = mySingleList.size();
        System.out.println(ret);

        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(8);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addLast(20);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addIndex(2,66);
        mySingleList.disPlay();
        System.out.println();

        boolean ret2 = mySingleList.contains(66);
        System.out.println(ret2);

        mySingleList.remove(66);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.addFirst(9);
        mySingleList.addIndex(1,9);
        mySingleList.addIndex(2,9);
        mySingleList.addIndex(5,9);
        mySingleList.disPlay();
        System.out.println();

        mySingleList.removeAllKey(9);//removeALLKey

        mySingleList.disPlay();
        System.out.println();

        mySingleList.clear();
        mySingleList.disPlay();
        System.out.println();
        mySingleList.addFirst(1);
        mySingleList.disPlay();
    }
}

下面是MySingleList类的全部代码

public class MySingleList implements Ilist{
    static class ListNode{
        public int val;
        public ListNode next;

        public ListNode(int val) {
            this.val = val;
        }
    }

    public ListNode head;

    public void creatList(){
        ListNode node1 = new ListNode(5);
        ListNode node2 = new ListNode(6);
        ListNode node3 = new ListNode(8);
        ListNode node4 = new ListNode(10);
        ListNode node5 = new ListNode(15);

        node1.next = node2;
        node2.next = node3;
        node3.next = node4;
        node4.next = node5;
        this.head = node1;
    }


    @Override
    public void addFirst(int date) {
        ListNode node = new ListNode(date);
        node.next = head;
        head = node;
    }

    @Override
    public void addLast(int date) {
        ListNode node = new ListNode(date);
        ListNode cur = head;
        while(cur.next != null){
            cur = cur.next;
        }
        cur.next = node;
    }

    @Override
    public void addIndex(int index, int date) {
        int len = size();
        if(index < 0 || index > len){
            System.out.println("index位置不合法");
            return;
        }
        if(index == 0){
            addFirst(date);
        }
        if (index == len){
            addLast(date);
        }
        ListNode cur = head;
        while( index - 1 != 0 ){
            cur = cur.next;
            index--;
        }
        ListNode node = new ListNode(date);
        node.next = cur.next;
        cur.next = node;
    }

    @Override
    public boolean contains(int key) {
        ListNode cur = head;
        while(cur != null){
            if(cur.val == key){
                return true;
            }
            cur = cur.next;
        }
        return false;
    }


    @Override
    public void remove(int key) {
        if(head == null){
            return;
        }
        if(head.val == key){
            head = head.next;
            return;
        }
        ListNode cur = findNodeIndex(key);
        if(cur != null){
            cur.next = cur.next.next;
        }else{
            System.out.println("没有要删除的key值");
            return;
        }
    }
    //供remove使用的方法
    private ListNode findNodeIndex(int key){
        ListNode cur = head;
        while(cur.next != null){
            if(cur.next.val == key){
                return cur;
            }
            cur = cur.next;
        }
        return null;
    }


    @Override
    public void removeAllKey(int key) {
        if(head == null){
            return;
        }
        ListNode prev = head;
        ListNode cur = head.next;

        while(cur != null){
            if(cur.val == key){
                prev.next = cur.next;
                cur = cur.next;
            }else{
                prev = cur;
                cur = cur.next;
            }
        }
        if(head.val == key){
            head = head.next;
        }

    }
    @Override
    public int size() {
        int len = 0;
        ListNode cur = head;
        while(cur != null){
            len++;
            cur = cur.next;
        }
        return len;
    }

    @Override
    public void clear() {
        ListNode cur = head;
        while(cur != null){
            ListNode curN = cur.next;
            cur.next = null;
            cur = curN;
        }
        
        head = null;
    }
   
    @Override
    public void disPlay() {
        ListNode cur = head;
        while(cur != null){
            System.out.print(cur.val + " ");
            cur = cur.next;
        }
    }



}



IList接口中的全部代码

public interface Ilist {
    //头插法
    public void addFirst(int date);
    //尾插法
    public void addLast(int date);
    //任意位置插入,第一个节点为0号下标
    public void addIndex(int index, int date);
    //删除第一次出现值为key的节点
    public void remove(int key);
    //判断链表中是否存在值为key的节点
    public boolean contains(int key);
    //删除所有值为key的节点
    public void removeAllKey(int key);
    //获得链表的长度
    public int size();
    //清空链表
    public void clear();
    //显示链表
    public void disPlay();
}

 

 

Matlab之fdesign的应用说明 fdesign 是 MATLAB 中用于数字滤波器设计的工具(属于),它提供了一种系统化的方式来定义滤波器参数并生成相应的滤波器。指定滤波器的频率、幅度等参数。例如,设计一个低通滤波器:Fs = 1000;% 采样率 (Hz)% 通带截止频率% 阻带截止频率Apass = 1;% 通带衰减 (dB)Astop = 60;% 阻带衰减 (dB) 阅读详情

相关推荐

Llama模型结构拆解:为什么MLP模块要这样设计?从参数配置到计算流程全解析

本文深入解析了Llama模型MLP模块的设计精髓。通过拆解其三线性层结构、门控机制与SwiGLU激活函数,揭示了并行计算如何提升效率,并详细阐述了intermediate_size参数配置背后的经验权衡与计算考量,帮助读者透彻理解这一核心组件的设计逻辑与工程实现。

mac99的博客 529

【数据结构】单向无头非循环链表

摘要:本文介绍了链表的基本概念及实现。链表是一种非连续的存储结构,通过节点间的引用链接实现逻辑顺序。重点讲解了无头单向非循环链表的特点和实现方法,包括头插法、尾插法、任意位置插入、查找、删除等操作。通过Java代码示例展示了单向链表的完整实现,并与ArrayList进行对比,指出链表更适合频繁插入删除的场景。

2301_81614213的博客 1261

PSI5协议技术文档与驱动开发指南

• 供电与数据复用:ECU通过双绞线为传感器提供稳压(典型值5V-11V),同时检测线路电流变化实现数据传输。• 同步信号:ECU发送3.5V电压脉冲(上升沿触发传感器响应),用于时序同步。• 安全气囊:PSI5-P模式实现多碰撞传感器同步采样(响应时间<10ms)• CRC-3(3位):ASIL-B以上功能安全要求(如动力总成传感器)• 奇偶校验(1位):适用于低安全等级场景(如PSI5-P10P模式)• 典型应用:PSI5-P(并行总线)、PSI5-U(通用总线)

u012733413的博客 2867

java实现的无头单向非循环链表

接下来实现任意位置插入的方法,第一个数据节点为0号下标,任意位置插入涉及尾插,头插,还有中间插入,中间插入需要修改前后指向,所以需要找到插入位置的前一个,就可以实现互相绑定,而且绑定有一个规律:所有的绑定,优先绑定后面。还有我们要考虑到任意位置,是所有位置吗,我们还需要对index进行检查,不能小于0,也不能大于size();链式结构在逻辑上是连续的,但是在物理上不一定连续,现实中的结点一般是从堆上申请出来的,从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可能连续,也可能不连续。

2201_76124988的博客 1161

【C++】lambda表达式

本篇文章我们要学习的是lambda表达式,它是C++11新增的一种特别方便的语法,相较于之前的函数指针以及仿函数都方便了不少,下面就让我们一起来学习吧。

malloc不出对象的博客 2630

深入浅出卡尔曼滤波器算法

深入浅出讲解卡尔曼滤波器的工作原理及其公式推导,讨论卡尔曼滤波器的核心公式所代表的意义及个人的理解。

m0_37835056的博客 1365

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

通过源码知道,ArrayList底层使用数组来存储元素。由于其底层是一段连续空间,当,效率比较低,因此。因此:java集合中又引入了LinkedList,即链表结构。链表是一种存储结构,数据元素的是通过链表中的次序实现的。实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:1.2.3.虽然有这么多的链表的结构,但是我们重点掌握两种,一般不会单独用来存数据。实际中更多是作为,如哈希桶、图的邻接表等等。

chendemingxxx的博客 1973

SAP Fiori Launchpad 概述

SAP Fiori launchpad 是托管 SAP Fiori 应用程序的 shell,并为应用程序提供导航、个性化、嵌入式支持和应用程序配置等服务。SAP Fiori Launchpad 是移动和桌面设备上 SAP Fiori 应用程序的入口点。启动板显示带有图块的主页,其中可以显示实时状态指示器,例如打开的任务数量。每个图块代表用户可以启动的业务应用程序。这包括 SAP Business Suite 事务应用程序和 SAP Smart Business 分析应用程序。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 931

[Collection与数据结构] 链表与LinkedList (一):链表概述与单向无头非循环链表实现

上篇文章我们已经对顺序表进行了实现,并且对ArrayList进行了使用,我们知道ArrayList底层是使用数组实现的.由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。

无需多言 1368

RK3588上使用PCIE接口的国产千兆网卡YT6801

YT6801是裕太微电子开发的一款国产千兆PCIE以太网控制器芯片,可作为RK3588的PCIE外扩网口使用。

荻夜的博客 8212

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

从传统业务到 AI Skill:产品经理也能看懂的能力改造指南(含完整案例)

专注于编程、AI、人工智能等多个领域内容研究和分析 641

无头单向非循环java版的模拟实现

【本节目标】1.ArrayList的缺陷2.链表上节课已经熟悉了ArrayList的使用,并且进行了简单模拟实现。通过源码知道,ArrayList底层使用数组来存储元素:由于其底层是一段连续空间,当,效率比较低,因此。因此:java集合中又引入了LinkedList,即链表结构。链表是一种存储结构,数据元素的是通过链表中的次序实现的。实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:1.2.3.虽然有这么多的链表的结构,但是我们重点掌握两种,一般不会单独用来存数据。

2302_79269413的博客 1113

51-14 Retentive Network,RetNet 多尺度保留机制序列建模论文精读

RetNet 提出了多尺度保留机制序列建模,该机制支持三种计算范式,即并行、循环和分块循环。RetNet有更好的全局注意力建模、高效的计算效率、对遮挡的鲁棒性、支持基于注意力的图像生成、与置信度相关的门控机制和多任务学习等特点,对不同视觉任务可以共享历史注意力记忆,可以同时进行分类、分割、检测等任务。RetNet在视觉领域应该有广阔的应用前景。

AIgraphX 1613

Java手搓数据结构:从零模拟实现单向无头非循环链表

本文介绍了单向无头非循环链表的基本概念和实现方法。主要内容包括:1)链表的基本结构,类比火车车厢的节点连接方式;2)链表属性定义,通过接口规范操作方法;3)链表的具体实现,详细讲解了头插法、尾插法和任意位置插入的实现逻辑,并附有图示说明。文章还提供了自定义异常类来处理非法操作,确保链表操作的合法性。通过完整的代码示例,展示了如何构建一个完整的单向无头非循环链表数据结构。

加油,量变引起质变 609

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java_简单实现无头单向非循环链表_简单实现LinkedList

/头插法//尾插法//任意位置插入,第一个数据节点为0号下标//查找是否包含关键字key是否在单链表当中//删除第一次出现关键字为key的节点//删除所有值为key的节点//得到单链表的长度@Override@Override@Override@Override@Override@Override@Overridereturn 0;@Override@Override节点类包含存储数据和下一个节点引用。//头插法//尾插法。

weixin_66484088的博客 870

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

数据结构:LinkedList与链表—无头单向链表(一)

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

zm3rttqs9f的博客 1272

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

数据结构——无头单向非循环链表的实现

文章目录一、什么是链表?1.链表的结构及概念2.链表的分类1.带头或者不带头2.单向或者双向3.循环或者非循环二、无头单向非循环的链表实现1.无头单向非循环链表的接口2.每个接口的具体实现总结 一、什么是链表? 1.链表的结构及概念 概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的 。 现实中的数据结构-----哈哈----可爱的小火车 重庆的轻轨: 2.链表的分类 我们注意上面

冯同学的博客 895

【java-数据结构】模拟无头单向非循坏链表,掌握背后的实现逻辑

用java语言模拟实现一个单链表;总结链表的优缺点以及应用场景。

m0_74284629的博客 1475

数据结构-3.Java. 链表

由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。说明:1. LinkedList实现了List接口2. LinkedList的底层使用了双向链表3. LinkedList没有实现RandomAccess接口, 因此LinkedList不支持随机访问4. LinkedList的任意位置插入和删除元素时的效率比较高,时间复杂度为O(1)5. LinkedList比较适合任意位置插入的场景。

薯条不要番茄酱的博客 2002

[数据结构] 链表之一(胖黑)毁所有 (无头单向非循环链表实现)

​ 🍹欢迎各路大佬来到 Nick 主页指点 ☀️本期文章将学习 [数据结构] 链表之一(胖黑)毁所有 (无头单向非循环链表实现),我是博主Nick。✨ ✨我的博客主页:Nick_Bears 🌹꧔ꦿ 🌹꧔ꦿ博文内容如对您有所帮助,还请给个点赞 + 关注 + 收藏✨ ​

Nick 的笔记 513

Java线性表之无头非循环单向和双向链表的实现

1.1链表的概念及结构 1.2链表的简单实现 1.2.1无头单向非循环链表的实现 (1)显示单链表(2)头插法(3)尾插法 (4)获取单链表的长度(5)任意位置插入,第一个数据节点为0号下标 (6)查找是否包含关键字key是否在单恋表中 (7)删除第一次出现关键字为key的节点(8)删除所有值为key的节点(9)尾删法 (10)清空单链表 1.2.2 无头双向非循环链表的实现

na 小子叫坚强的博客 1392

Java 数据结构与算法(五):单链表详解——基本原理与 Java 手写实现

本文详细介绍单链表的基本概念、节点结构及存储特点,并使用 Java 手写无头单向非循环链表,实现遍历、查找、头插、尾插、指定位置插入、删除及清空等操作。结合示意图分析节点之间的引用关系与修改过程,重点讲解插入、删除的实现原理及时间复杂度,帮助初学者深入理解单链表的底层实现。

深耕 Java 后端,沉淀技术知识,记录成长之路。 1674

java实现无头单向链表

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 单向、带头、循环 双向 、不带头 、非循环 无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈 希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多。 相关方法代码实现: package L...

qq_44791951的博客 279

java 数据结构LinkedList类

在集合框架中,LinkedList也实现了List接口,具体如下:说明实现了List接口的底层使用了双向链表没有实现接口,因此LinkedList不支持随机访问的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)比较适合任意位置插入的场景。

N_0050的博客 1552

【java-数据结构】模拟双向无头非循环链表,掌握背后的实现逻辑

java语言模拟实现双向链表及其操作,并总结链表的优缺点以及应用场景

m0_74284629的博客 992

Java无头单向链表

链表: 是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。 实际中链表的结构非常多样,以下情况组合起来就有8种链表结构: 单向、双向 带头、不带头 循环、非循环 对这六种排列组合即可得到八种链表的名称; 我们今天实现的是 无头单向链表 ```java // 1、无头单向非循环链表实现 public class SingleLinkedList { ...

qq_45349785的博客 234
上一篇: 数据结构--顺序表小项目--简单洗牌算法(JAVA)
下一篇: Java写数据结构:栈
刘 大 望
博客等级 码龄2年 896粉丝 61原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值