链表超详细解析,特点介绍,方法使用,底层模拟实现

告别软件轮询!用STM32G474的COMP比较器实现纳秒级硬件过压保护(CubeMX配置详解) 本文详细介绍了如何利用STM32G474的COMP比较器实现纳秒级硬件过压保护,通过CubeMX配置详解,展示了硬件比较器相比传统软件轮询方案在响应时间、CPU占用和可靠性等方面的显著优势。文章还提供了实战配置流程和优化技巧,帮助工程师快速构建高效的硬件保护系统。 阅读详情

前言❤️❤️

hello hello💕,这里是洋不写bug~😄,欢迎大家点赞👍👍,关注😍😍,收藏🌹🌹
上篇博客解析了顺序表的使用,顺序表有两大局限性
空间利用率低(创建后会申请一块数组空间,可能存储的数据用不完这块空间)
在中间插入元素时,需要进行搬运,效率低


这篇博客要解析的链表,就能很好的解决这两个问题
这个专栏的数据结构是代码都是用Java来写的,JavaSE专栏现在已经全部更新完成,铁汁们复习基础知识时非常推荐使用,可以试一下💪💪💪
在这里插入图片描述
🎇个人主页:洋不写bug的博客
🎇所属专栏:数据结构专栏
🎇复习Java基础知识:Java学习之旅,从入门到进阶
🎇铁汁们对于数据结构基础的各种核心知识(不太常用的也有😆),都可以在上面的数据结构专栏学习,专栏正在持续更新中🐵🐵,有问题可以写在评论区或者私信我哦~

1,链表简介

顺序表的底层是数组,存储空间需要是连续的,而链表则没有这个要求,可以存储在离散的空间上

在这里插入图片描述



那既然空间是离散的,如何知道链表中有哪些元素,又如何遍历链表中的元素呢?

在链表中,每个节点上面都引入了一个引用变量,称为"next",使用这个引用保存下一个元素对应的内存地址,最后一个元素这个引用变量的值就是null

在这里插入图片描述

2,链表的分类

链表有两个特点:

  1. 空间分布是离散的
  2. 每个元素都记录了下个元素的地址

链表的每个元素也称为节点,对于链表,只要知道了第一个元素,后续整个链表就都能拿到了,因此,习惯上也用第一个节点代指整个链表



链表其实有很多种分类:

  1. 单向还是双向
  2. 带不带头节点(傀儡节点)
  3. 是不是循环的



单向和双向

前面提到的链表,每个节点存储了下一个节点的地址,知道一个中间节点,可以找到下个节点,是找不到上个节点的,这种链表就是单链表,日常使用最多的链表就是这种

双向链表,也就是每个节点上有两个引用:next和prev,存储了上个节点和下个节点的地址,知道一个节点,可以同时找出它的上下节点;双链表的功能自然是更强大,但是消耗的空间也更多了



带不带头节点

这个说法只是《数据结构》教材中规定这样,对于编程,是不严谨的也不好理解的,头节点的意思我们理解应该是“链表的第一个节点”,所有链表应该都有呀

《数据教材》这里说的有没有头节点,严格来说是有没有傀儡节点

傀儡节点不存储数据,在链表的最前面,只是用来占个位子,来简化代码的书写(为什么能简化铁汁们后面编程就能体会到)

前面提到,一般用链表的第一个节点代表整个链表,一般通过head引用指向第一个节点,现在有个储存了1、2、3、4的链表,如果head引用拿到的节点是元素1,那这个链表就不带傀儡节点

在这里插入图片描述

如果head引用拿到的节点不是元素1,这个节点的next才是元素1,那这个链表就带傀儡节点

在这里插入图片描述




是不是循环的

这个非常简单,如果最后一个节点指向null,那链表就是非循环的;如果最后一个节点指向第一个节点,那这个链表就是循环链表(循环链表就算一直next,也不会报错,因为到最后一个节点又会绕回来)



这三种特征看起来能排出9种链表组合,经常使用的也就两种:

  • 笔试面试中:单向,不带傀儡,不循环的链表
  • 实际开发中:双向,不带傀儡,不循环的链表

3,链表方法

链表的集合类是LinkedList,跟ArrayList都是实现了List接口,所以部分方法是通用的(例如插入都用add,删除都用remove)

1,增

add方法插入元素,在链表中就是尾插,还可以传入参数,前面是下标,后面是元素,这里传入1和4,就是往下标为1元素前插入4(插入完成后,新插入的元素的下标就是1)

import java.util.LinkedList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(1,4);
        System.out.println(list);
    }
}

在这里插入图片描述



还有addFirst和addLast方法,就是头插和尾插,但是这里尝试调用是没有的,因为这些方法是LinkedList特有的,在List接口中是没有的,在编译阶段只看左边声明的类型 List,识别不到有这个方法

在这里插入图片描述

如果想要使用这些LinkedList特有的方法的话,需要在创建引用的时候把引用的类型设定为LinkedList(addLast方法和add方法的效果是完全一样的,都是尾插)

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.addFirst(100);
        list.addLast(200);
        System.out.println(list);
    }
}

在这里插入图片描述

2,删

remove方法传入基础数据类型,就是按下标来删除,传入包装类,就是按照元素的值来删除

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.remove(0);
        System.out.println(list);
        list.remove(Integer.valueOf(3));
        System.out.println(list);
    }
}

在这里插入图片描述


LinkedList中有特定的尾删和头删方法,removeFirst和removeLast

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        list.removeFirst();
        list.removeLast();
        System.out.println(list);
    }
}

在这里插入图片描述

3,改

set和get方法就是传入下标,按下标去读取元素或者修改元素

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        System.out.println(list.get(0));
        list.set(2,100);
        System.out.println(list);
    }
}

在这里插入图片描述

4,查

通过contains来判断元素是否存在,存在就返回true,否则就返回false
还可以通过indexOf方法,查到就返回元素下标,查不到就返回-1

import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        System.out.println(list.contains(3));
        System.out.println(list.indexOf(2));
    }
}

在这里插入图片描述

5,遍历

遍历可以使用迭代器,和顺序表的使用方法相同

import java.util.Iterator;
import java.util.LinkedList;

public class Test {
    public static void main(String[] args) {
        LinkedList<Integer> list = new LinkedList<>();
        list.add(1);
        list.add(2);
        list.add(3);
        list.add(4);
        list.add(5);
        Iterator<Integer> iterator = list.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}

在这里插入图片描述

因为链表跟顺序表使用了同一个接口,因此顺序表的方法链表基本上都能用,比如clear()方法清空链表,.size()方法统计长度等,这里就不再赘述了

4,链表的模拟实现

上篇博客顺序表的模拟实现,更改操作都是在数组上进行的,比较简单,链表的模拟实现就会稍微复杂一些,这里我们模拟实现就不用泛型了,就实现个String类型的链表即可

链表的一个节点里存储了数据信息和下个节点的引用,建一个Node类来表示链表中的节点,属性为value和next(这个next就是下个节点的引用,是Node类型),构造方法是传入value,把next默认设置为null

public class Node {
    public String value;
    public Node next;

    public Node(String value) {
        this.value = value;
        this.next = null;
    }
}

我们自己实现的这个链表设定为没有傀儡节点,定义一个头节点head,头节点如果为null的话,那就说明整个链表就是空的(链表是不需要像顺序表那样搞个size来表示数组中的有效区间)

public class MyLinkedList {
    private Node head = null;
}



addFirst方法,参数传入String类型value,根据这个value来创建节点,那节点的next引用如何修改就需要画图来分析下(这里博主就拿数字类型的链表来举例,原理是一样的),最初head指向第一个元素,如下图:

在这里插入图片描述



这时候如果想要插入一个新的节点newNode,其实特别简单,无非就是两步操作,第一步,让newNode指向原来head指向的节点(也就是原链表的第一个节点);第二步,让head指向newNode,这个newNode就成了新的头节点

注:第一步和第二步的顺序是不能颠倒的,如果先用head指向newNode,那原链表就相当于找不到了,Java的垃圾回收机制会把没有引用指向的链表给删除掉

    public void addFirst(String value){
        Node newNode = new Node(value);
        newNode.next = head;
        head = newNode;
    }



如果使用addFirst的时候,链表是空的,这时候head指向null,newNode就相当于是链表中的第一个节点,依然是按照这两步来操作(newNode这时候是链表中的最后一个节点,最后一个节点就是要指向null)

在这里插入图片描述



写完后在main方法中测试下,虽然还没有重写toString方法,可以在最后的打印语句那里打上断点,调试一下,在调试窗口看一下这些节点的信息

在这里插入图片描述

在这里插入图片描述



重写toString方法,先创建一个StringBuilder类型的可变字符串,往里面添加元素,顺序表是通过数组下标来获取每个元素的,链表这里就需要通过节点的引用来获取元素

同样写个for循环,链表的节点每次向后走一步,直到链表的节点为空

    @Override
    public String toString() {
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append("[");
        for(Node cur = head;cur != null;cur = cur.next){
            stringBuilder.append(cur.value);
            if(cur.next != null){
                stringBuilder.append(",");
            }
        }
        stringBuilder.append("]");
        return stringBuilder.toString();
    }

重写后在main方法中打印,就能打印出所有元素了



addLast方法,就是在链表中进行尾插,那关键一步就是找到链表的尾节点,如何找呢,就是从head开始,一直往后next,直到再next为null,那就找到尾节点了

在这里插入图片描述

这样写,铁汁们在main方法中测试addLast方法的话,就会发现:如果链表中有元素的话,这个方法是能正常使用的;如果链表本身是空的,再使用这个方法,就会报错

    public void addLast(String value){
        Node tail = head;
        for(;tail.next != null;tail = tail.next){
        }
        Node newNode = new Node(value);
        tail.next = newNode;
    }
public class Test {
    public static void main(String[] args) {
        MyLinkedList myLinkedList = new MyLinkedList();
        myLinkedList.addLast("a");
        System.out.println(myLinkedList);
    }
}

在这里插入图片描述

当链表为空时,head引用就是null,这时候tail就也是null,tail就不会进入for循环,直接tail.next = newNode,也就相当于是null.next = newNode,null`代表 “不存在的对象”,没有任何属性和方法,因此这里就会报错

更正代码,就是当tail的值为null时,按照addFirst那套进行操作,这样当链表为空时进行addLast就不会报错了

    public void addLast(String value){
        Node newNode = new Node(value);
        if (head == null){
            newNode.next = head;
            head = newNode;
            return;
        }
        Node tail = head;
        for(;tail.next != null;tail = tail.next){
        }

        tail.next = newNode;
    }



add方法里面可以传入下标和元素,也就是在该下标节点前插入新的节点,在链表中其实是没有下标的概念的,只是Java标准库中的LinkedList和ArrayList都实现了List接口,所以也引入了下标的概念

按照下标插入元素,首先要知道链表的元素个数,因为写合法性校验时必须用到,那就写个size()方法,用来统计元素的个数

    public int size(){
        int size = 0;
        for(Node cur = head;cur != null;cur = cur.next){
            size++;
        }
        return size;
    }



add方法是在指定下标的元素前进行首插,先分析这个元素要插在链表中间的情况,例如newNode要插到cur节点的前面,cur节点的上个节点原来是prev,如下图

操作分为两步:第一步,让newNode节点指向cur节点;第二步,让prev节点指向newNode节点(这两步的执行顺序也是不能改变的,如果先用prev节点指向newNode节点,那也就没有引用指向cur节点了,cur节点和cur节点后面的数据就丢失了)

在这里插入图片描述


分析清楚后,来写代码,首先进行index的合法性校验(index是可以等于size的,这样就相当于针对链表的最后一个元素进行尾插)

接着就是先找到prev的位置,这样cur也就找到了,按照前面分析的两步来操作,就完成了节点的插入

    public void add(int index,String value){
        if(index < 0 || index > size()){
            throw new IndexOutOfBoundsException("index:" + index + ",Size:" + size());
        }
        Node prev = head;
        for(int i = 0;i < index - 1;i++){
            prev = prev.next;
        }
        Node cur = prev.next;
        Node newNode = new Node(value);
        newNode.next = cur;
        prev.next = newNode;
    }




接着考虑下特殊情况,index的值为0或者size()的情况

  1. 当index的值为size()的时候,这时候prev就是链表中最后一个节点,cur就是null,前面写的代码是包括这种情况的
  2. 当index的值为0时,这时候就没有prev了,就直接按照addFirst的操作来写即可,完整方法如下:
    public void add(int index,String value){
        if(index < 0 || index > size()){
            throw new IndexOutOfBoundsException("index:" + index + ",Size:" + size());
        }
        Node newNode = new Node(value);
        if(index == 0){
            newNode.next = head;
            head = newNode;
            return;
        }
        Node prev = head;
        for(int i = 0;i < index - 1;i++){
            prev = prev.next;
        }
        Node cur = prev.next;
        newNode.next = cur;
        prev.next = newNode;
    }



contains方法,也就是判断一个元素在链表中是否存在,把链表遍历,比对一遍即可

    public boolean contains(String value){
        for(Node cur = head;cur != null;cur = cur.next){
            if(cur.value.equals(value)){
                return true;
            }
        }
        return false;
    }



indexOf方法,查找元素,查找到就返回下标,查找不到就返回-1

    public int indexOf(String value){
        int index = 0;
        for(Node cur = head;cur != null;cur = cur.next){
            if(cur.value.equals(value)){
                return index;
            }
            index++;
        }
        return  -1;
    }



remove方法,删除链表中的节点,里面传入int类型就是按照下标来删除节点,先分析删除的节点位于链表中间的情况,删除操作特别简单,如果要删除某个节点,直接让这个节点的上个节点指向这个节点的下个节点即可

如下图,prev的引用指向下个节点后,也就没有节点指向需要删除的节点了,那根据Java的垃圾回收机制,这个节点就会被自动释放掉

在这里插入图片描述



写代码的时候,在index合法性校验这里,index的值就不能等于size()了,因为这是删除元素,在链表中最大的下标是到index - 1的

接下来就是定位prev,然后改一下prev的指向即可

    public void remove(int index){
        if(index < 0 || index >= size()){
            throw new IndexOutOfBoundsException("index:" + index + ",Size:" + size());
        }
        Node prev = head;
        for(int i = 0;i < index - 1;i++){
            prev = prev.next;
        }
        prev.next = prev.next.next;
    }



如果要删除的链表尾部的元素,那prev.next.next = null,接着把prev.next改为null,这时候prev就成最后一个元素了

如果删除链表头部的元素,其实也特别简单,直接让head指向head的下一位即可,完整方法如下:

    public void remove(int index){
        if(index < 0 || index >= size()){
            throw new IndexOutOfBoundsException("index:" + index + ",Size:" + size());
        }
        if (index == 0){
            head = head.next;
            return;
        }
        Node prev = head;
        for(int i = 0;i < index - 1;i++){
            prev = prev.next;
        }
        prev.next = prev.next.next;
    }



还有在remove方法中传入value,按照元素来删除,首先判断下,如果要删除的是头节点的话,就直接head = head.next

确定删除的不是头节点,那就需要遍历链表,需要找到待删除节点的前一个节点的位置prev,然后直接prev = prev.next.next

我们不妨直接写个prev的for循环,因为比较的prev.next的value和传入的value是否相等,当prev走到链表最后一个节点时,就已经遍历完成了(如下图),for循环的条件就为prev.next != null

在这里插入图片描述

传入value比较时,当链表为空时,就直接返回,否则代码中用到null.next就会报错

 public void remove(String value){
        if(head == null){
            return;
        }
        if(head.value.equals(value)){
            head = head.next;
            return;
        }
        Node prev = head;
        for(;prev.next != null;prev = prev.next){
            if(prev.next.value.equals(value)){
                prev.next = prev.next.next;
                break;
            }
        }
    }



清空链表操作,直接让head = null,没有引用指向链表头节点时,垃圾回收机制就会把链表内存释放掉(没有引用指向头节点,头节点内存释放,头节点内存释放后,没有引用指向头节点的下个节点,头节点的下个节点内存也被释放掉,以此类推)

    public void clear(){
        head = null;
    }



至此,我们完成了自己的模拟链表(链表常用的方法都模拟实现了🐵💪)

在这里插入图片描述

结语

  • 链表的模拟实现是比顺序表要稍微复杂一些的,对于一些复杂的情况,还需要画图来分析
  • 有关链表的算法题(下篇博客会进行解析)大部分也都需要画图分析,模拟实现链表能够提高解决链表算法题的能力,

以上就是今天的所有内容啦~完结撒花~🥳🎉🎉

在这里插入图片描述

PX4从放弃到精通(五):PX4中的姿态表示方法及转换关系 文章目录机体坐标系与地理坐标系一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 机体坐标系与地理坐标系 在实际应用中,加速度计的测量轴是由运动平台安装固定此器件的轴向决定的。这些坐标轴就形成了载体坐标系,定义如下: 坐标原点设在载体质心(这样可简化运动方程的推导); y轴指向载体前方,称为横滚轴,横滚角以y轴为起始旋转轴而得到,符合右手定则; x轴与y轴夹角90°,指向载体横向,称为俯仰轴,俯仰角以x轴为起始旋转轴而得到,符合右手定则; z轴与x轴、y轴构成右手笛卡儿坐标系,指向载体垂直方向 阅读详情

相关推荐

解锁笔记智能对话:手把手配置 Obsidian Copilot 插件与硅基流动模型

本文详细介绍了如何为Obsidian笔记软件配置Copilot插件,并接入硅基流动AI模型,从而为个人知识库添加智能对话能力。通过手把手教程,指导用户完成插件安装、API Key获取、模型配置及索引构建,最终实现基于个人笔记内容的深度语义问答,提升知识管理效率。

corn8的博客 612

数组模拟链表(超详细)

通过指针把每一个元素的值联系在一起,不要求逻辑上(链表逻辑)相邻的两个元素在物理位置上也相邻,那么就需要链表元素需要两个数据,一个是储存该元素的值,一个是储存链表下一个元素的地址,两者统称为一个节点,接下来每一个元素都用对应的节点表示,阐明两个存储数据。再将idx节点下一个元素的地址赋值(这个值是k节点的下一个元素的地址,即ne[k])所以是ne[idx]=ne[k].一个元素有三个数据,一个是元素的值,一个是下一个元素的地址,还有一个是上一个元素的地址,像这样的链表就是双链表。

qq_73659105的博客 5677

ESP-01S获取网络时间踩坑全记录:AT指令调试、JSON解析乱码、时区处理,一个都不能少

本文详细记录了使用ESP-01S WIFI模块获取网络时间的完整过程,包括AT指令调试、JSON解析乱码处理以及时区转换等关键步骤。通过实战案例和代码示例,帮助开发者避开常见陷阱,实现稳定的网络时间同步功能。

weixin_30460489的博客 295

【C++】模拟实现 list:双向链表的构建与解析

本文详细介绍了 C++ 中 list 类的模拟实现过程。首先分析了 list 类的功能需求,包括存储元素、元素访问与修改、元素数量操作、迭代器支持和内存管理等方面,强调其通过节点指针链接实现灵活操作。接着阐述了模拟实现的关键步骤,定义了包含节点结构体的MyList类,节点有数据及前后指针。文中展示了默认、指定大小和拷贝构造函数,析构函数用于正确释放内存。获取元素数量、判断为空、添加删除元素(如头部尾部插入删除、指定位置插入删除)等函数的实现逻辑清晰,迭代器相关函数也有详细说明,文末还提供了投票以获取读者反馈

A Charmer 的博客 2505

【ROS学习笔记】8.话题消息(Message)的定义与使用

ROS学习笔记8——话题消息(Message)的定义与使用

takedachia的博客 9547

家庭宽带IPv6避坑指南:如何通过DHCPv6-PD获取公网地址(附OpenWRT配置)

本文详细解析了家庭宽带IPv6的地址分配机制,重点介绍了通过DHCPv6-PD获取公网地址的方法,并提供了OpenWRT路由器的具体配置步骤。从路由器通告(RA)标记位到前缀委派(PD)流程,帮助用户解决IPv6部署中的常见问题,实现稳定高效的IPv6网络连接。

backprop5master的博客 1185

Java【链表】详细图解/ 模拟实现+【LinkedList】常用方法介绍

以上就是今天分享的关于数据结构中【链表】的内容,一方面介绍了如何模拟实现简易的单链表,一方面介绍了Java集合框架中的 LInkedList 类的基本使用,并且分析了链表和顺序表的区别对比上山总比下山辛苦下篇文章见。

yzhcjl_的博客 2323

西门子S7-200 SMART PLC高速计数器与增量式编码器实战配置指南

在工业自动化控制系统中,传感器是将物理量转换为电信号的关键组件,其中编码器作为核心的位置与速度检测元件,其工作原理基于光电或磁电效应,将机械位移转换为脉冲序列。增量式编码器通过输出相位差90度的A/B两相脉冲,不仅能实现精确的位移测量,还能通过相位关系自动判别运动方向,并通过倍频技术提升分辨率。其技术价值在于为PLC等控制器提供了实时、高精度的位置反馈,是实现闭环控制、提升系统精度与可靠性的基础。在包装机械、物料输送、绕线设备等应用场景中,编码器与PLC高速计数器的协同工作是实现精确定位、定长切割与速度控制

weixin_29178069的博客 394

【C++】深度解析:用 C++ 模拟实现 list 类,探索其底层实现细节

list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。 list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。 list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。 与其他序列式容器相比,list和forwar

专注于前后端学习 1586

Linux ARM平台开发系列讲解(GMSL摄像头篇)1.2 MAX9296 GMSL链路配置

串行器 +解串器组成,软件需要做的就是写这三部分的驱动,让摄像头数据能到达。3. 配置解串器和串行器的GMSL链路。串行器和解串器上电成功之后,就可以配置。软件配置(注意软件只可以配置速率,2. 9296上电,使能芯片。的版本和速率,比如版本是配置。配置成功之后,就会出现串行器。的链路,其它同类型的。设备地址,我设置的是。...

DSMGUOGUO的博客 1万+

【WRFDA第一期】WRF数据同化概述及资源整理

【WRFDA第一期】WRF数据同化概述及资源整理

WW、forever的博客 1658

单双链表—模拟实现,实战应用全解析!

单双链表—模拟实现,实战应用全解析!还有更多的例题讲解哦~~~

一年,我很需要这一年 1346

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【C++】list 链表的使用+模拟实现

本文主要介绍C++【STL】容器中的 list,包括接口说明和模拟实现。其中讲解了迭代器功能上的分类,让你了解为何 list 要实现这个接口。

x_p96484685433的博客 1793

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

【C++】——list的介绍及使用 && 模拟实现

世上有两种耀眼的光芒,一种是正在升起的太阳,一种是正在努力学习编程的你!一个爱学编程的人。各位看官,我衷心的希望这篇博客能对你们有所帮助,同时也希望各位看官能对我的文章给与点评,希望我们能够携手共同促进进步,在编程的道路上越走越远!提示:以下是本篇文章正文内容,下面案例可供参考list的文档介绍list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。

2301_79585944的博客 1379

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

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

详细介绍list的模拟实现及特点

在数据结构中,有一种链表结构是带哨兵位的头节点,其每一个节点都有一个指向上一个节点的指针以及指向下一个节点的指针,从而形成一种环状结构。STL中list就采用了带头双向循环链表的结构,弥补了(vector)连续空间的结构不适于对中间数据频繁插入删除的缺点。

weixin_43932886的博客 953

数组模拟实现链表(C++)

本章介绍怎么使用数组模拟链表,首先得理解其定义链表是指由一系列储存在非连续储存空间 结点组成的储存结构。每个结点由两部分组成:一是储存元素的数据域,一是储存下一个节点地址的指针域。用数组模拟链表得十分清晰明了地理解这一定义。为什么要用数组模拟实现呢?数组实现的双链表本质上是静态链表,但是具有实现简单,速度极快等特点,比数据结构书上声明新的数据类型的方法代码简洁,好记忆。数组是一种线性结构,存储空间是内存连续的,每当创建一个数组时,就必须先申请好一段指定大小的空间。

weixin_72668830的博客 2318

数据结构----链表介绍、模拟实现链表、链表的使用

链表是一种常见的数据结构,它由一系列节点组成,每个节点包含两部分:数据元素 (value) 和指向下一个节点的指针 ( next 域 )。通过这些节点的连接,可以形成一个链式结构。【单个节点】:节点(Node):链表的基本单元,包含数据域和next指针域。数据域可以是任意类型的数据,指针指向下一个节点。每个节点都是一个对象。【节点组成的链式结构】:结论: 链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。LinkedList 的官方文档。

qq_54176670的博客 1424

C++ list容器的解析和使用(包含模拟实现)

list本质是一个双向链表 而链表的详细解析请移步我的另一篇文章单链表的实现。

Fcy648的博客 1158

如何用数组来模拟实现链表

习惯了定义一个Node类型作为链表的节点,如此一来,无论是插入、删除,还是查找,代码实现都非常便捷。但如果用数组来实现链表,又该如何去考虑呢?

浮晓悠羡 5679

数组模拟实现链表

两个⾜够⼤的数组,⼀个⽤来存数据,⼀个⽤来存下⼀个结点的位置变量 h ,充当头指针,表⽰头结点的位置变量 id ,为新来的结点分位置注意我们这里是有一个头结点的(即h和id所指的位置)int h;// 头指针int id;// 下⼀个元素分配的位置// 数据域和指针域// 下标0位置作为哨兵位// 其中ne数组全部初始化为0,其中ne[i] = 0就表⽰空指针,后续没有结点// 当然,也可以初始化为- 1作为空指针,看个⼈爱好/*

2301_80224556的博客 1352

【list】list库介绍 + 简化模拟实现

list介绍 + 简化模拟实现

BinaryWiker的博客 1905

【数据结构】基于比较的排序算法 - 交换排序

本文介绍交换排序中的冒泡排序与快速排序。冒泡排序通过相邻元素比较交换,实现升序,时间复杂度最坏为O(N²),空间复杂度O(1),稳定且适合小规模有序数据。快速排序采用分治思想,以基准值划分区间,平均时间复杂度O(N log N),空间复杂度O(log N),但不稳定,实际应用中性能优异,可通过随机基准、小区间优化等提升效率。

careathers的博客 329
上一篇: ArrayList 超详细解析:方法使用|发牌程序|杨辉三角|底层模拟实现
下一篇: 链表补充练习,双链表的模拟实现
洋不写bug
博客等级 码龄2年 87粉丝 102原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值