List——顺序表与链表(二)

c++STL常用容器之List容器——全面总结(附案例解析)(十六) 这里有C++STL——全面总结详细教程(附案例解析)(持续更新中) 目录​​​​​​​ list容器 list基本概念 list构造函数 list 赋值和交换 list 大小操作 list 插入和删除 list 数据存取 list容器 list基本概念 功能:将数据进行链式存储 链表(list)是一种物理存储单元上非连续的存储结构,数据元素的逻辑顺序是通过链表中... 阅读详情


前言

上一篇文章中,介绍了List接口以及ArrayList的使用,并且进行了简单的模拟实现,通过源码知道,ArrayList底层使用数组元素来存储元素。但是由于其底层是一段连续空间,当在ArrayList任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后搬移,时间复杂度为O(n),效率比较低,且频繁的扩容会导致不必要的内存空间浪费,因此ArrayList不适合做任意位置插入和删除比较多的场景。因此:java集合中又引入了LinkedList,即链表结构。


一、链表概念及结构

链表是一种物理存储结构上非连续存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的 。
在这里插入图片描述

链表的结构非常多样,单向双向、带头或不带头、循环或非循环。这几种情况组合起来就有八种链表结构:

1.单向或者双向

在这里插入图片描述

2.带头或不带头

在这里插入图片描述
3.循环或非循环

在这里插入图片描述
无头单向非循环链表:结构简单,一般不会单独用来存数据。实际中更多是作为其他数据结构的子结构,如哈希桶、图的邻接表等等。另外这种结构在笔试面试中出现很多

无头双向链表:在Java的集合框架库中LinkedList底层实现就是无头双向循环链表。

二、LinkedList与链表

1.什么是LinkedList

LinkedList的底层是双向链表结构,由于链表没有将元素存储在连续的空间中,元素存储在单独的节点中,然后通过引用将节点连接起来了,因此在在任意位置插入或者删除元素时,不需要搬移元素,效率比较高。但是当需要查询时,就需要按图索骥按部就班的一个一个查,查询效率不高,这个后面总结对比时再详细说明。

在这里插入图片描述
说明:

  1. LinkedList实现了List接口
  2. LinkedList的底层使用了双向链表
  3. LinkedList没有实现RandomAccess接口,因此LinkedList不支持随机访问
  4. LinkedList的任意位置插入和删除元素时效率比较高,时间复杂度为O(1)
  5. LinkedList比较适合任意位置插入的场景

2.LinkedList的常用方法

方法解释
boolean add(E e尾插 e
void add(int index, E element将e插入到index位置
boolean addAll(Collection<? extends E> c)尾插c中的元素
E remove(int index)删除index位置的元素
boolean remove(Object o)删除遇到的第一个o
E get(int index)获取下标index位置的元素
E set(int index, E element)将下标index位置的元素修改为element并返回修改之前的元素
void clear()清空
boolean contains(Object o)判断o是否在链表中
int indexOf(Object o)返回第一个遇到的o的下标
int lastIndexOf(Object o)返回最后一个o的下标
List subList(int fromIndex, int toIndex)截取部分list
void display()打印链表

3.链表的遍历

遍历链表的几种方式:

public static void main(String[] args) {
LinkedList<Integer> list = new LinkedList<>();
list.add(1); // add(elem): 表示尾插
list.add(2);
list.add(3);
list.add(4);
list.add(5);
list.add(6);
list.add(7);
System.out.println(list.size());
// foreach遍历
for (int e:list) {
System.out.print(e + " ");
}
System.out.println();
// 使用迭代器遍历---正向遍历
ListIterator<Integer> it = list.listIterator();
while(it.hasNext()){
System.out.print(it.next()+ " ");
}
System.out.println();
// 使用反向迭代器---反向遍历
ListIterator<Integer> rit = list.listIterator(list.size());
while (rit.hasPrevious()){
System.out.print(rit.previous() +" ");
}
System.out.println();
}

三.实现自己的LinkedList

首先需要定义自己的MyList接口,接口中声明一系列方法后在MyLinkedList中实现,我们还需要定义一个结点类,这里我们实现的是带有前驱和后继的双向结点,以实现双向链表。具体实现如下:

MyList接口:

public interface MyList {
    /**
     * 返回链表中元素个数
     * @return
     */
    int size();

    /**
     * 尾插
     * @param e  将元素e尾插到线性表
     * @return  返回true
     */
    boolean add(Long e);

    /**
     * 将元素e插入到指定节点处
     * @param index
     * @param e
     */
    void add (int index,Long e);

    Long remove(int index);

    /**
     * 删除值为e的元素
     * @param e 需要删除的元素
     * @return 成功返回true  失败返回false
     */
    boolean remove(Long e);

    /**
     * 获取index处元素的值
     * @param index 数组下标
     * @return 该下标处的元素值
     */
    Long get(int index);

    /**
     * 修改元素
     * @param index [0,size)
     * @param e  修改后的元素
     * @return 原来index处的元素
     */
    Long set(int index,Long e);


    /**
     * 从前往后,返回第一次遇到e的下标
     * @param e 目标元素
     * @return 返回在第几个
     */
    int indexOf(Long e);

    /**
     * 从后向前
     * @param e
     * @return
     */
    int lastIndexOf(Long e);

    /**
     * 线性表中是否包含e
     * @param e
     * @return
     */
    boolean contains(Long e);

    /**
     * 打印顺序表
     */
    void display();


    /**
     * 判空
     * @return
     */
    boolean isEmpty();

    /**
     * 清空
     */
    void clear();

}

定义结点类

public class MyNode {
    Long val;
    MyNode next;  //指向后继节点,尾节点的后继是null

    MyNode prev;  //指向前驱节点,头节点的前驱是null

    public MyNode() {
        //无参构造方法
    }
    public MyNode(Long val) {
        //需传入值的有参构造
        this.val = val;
        this.next = null;
        this.prev = null;
    }
}

MyLinkedList实现类:

public class MyLinkedList implements MyList {
    //需要维护三个属性:链表的头节点、链表的尾节点、链表中元素个数
    private MyNode head;
    private MyNode last;
    private int size;

    //构造方法,构造一个空的链表
    public MyLinkedList() {
        this.head = this.last = null;
        this.size = 0;
    }

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

    @Override
    //链表的尾插
    public boolean add(Long e) {
        MyNode node = new MyNode(e);  //将元素e放入节点中
        node.next = null;
        //分情况讨论
        if (size > 0) {
            this.last.next = node;  //这一步将尾节点的后继指向新节点    (链接)
            node.prev = this.last;  //这一步让新节点的前驱指向之前的尾节点尾    (链接完成)
            this.last = node;    //这一步让新节点成为新的尾节点   (善后)
        } else {
            node.prev = null;
            this.last = this.head = node;
        }
        this.size++;    //涉及的增删的操作必须修改size!
        return true;
    }

    //链表的头插
    private boolean addFirst(Long e) {
        MyNode node = new MyNode(e);  //将元素e放入节点中
        node.next = null;
        if (size > 0) {
            this.head.prev = node;
            node.next = this.head;
            this.head = node;
        } else {
            this.head = this.last = node;
        }

        return true;
    }

    @Override
    public void add(int index, Long e) {
        if (index < 0 || index > size) {
            throw new ArrayIndexOutOfBoundsException("下标越界");
        }
        if (size == 0) {
            add(e);
            return;
        }
        if (size == 1) {
            if (index == 0) {
                addFirst(e);
            } else {
                add(e);
            }
            return;
        }
        if (index == 0) {
            addFirst(e);
            return;
        } else if (index == size) {
            add(e);
            return;
        }
        MyNode prevNode = this.head;
        for (int i = 0; i < index - 1; i++) {
            prevNode = prevNode.next;
        }
        MyNode curnode = prevNode.next;

        MyNode node = new MyNode(e);
        prevNode.next = node;
        curnode.prev = node;
        node.prev = prevNode;
        node.next = curnode;

        size++;
    }

    @Override
    public Long remove(int index) {
        if (index < 0 || index >= size) {
            throw new ArrayIndexOutOfBoundsException("下标异常");
        }
        if (size == 1) {
            Long e = this.head.val;
            this.head = this.last = null;
            this.size = 0;
            return e;
        }
        if (index == 0) {
            Long e = this.head.val;
            this.head = this.head.next;
            this.head.prev = null;
            size--;
            return e;
        }
        if (index == size - 1) {
            Long e = this.head.val;
            this.last = this.last.prev;
            this.last.next = null;
            size--;
            return e;
        }
        //走到这儿  说明链表中至少有两个元素
        MyNode curNode = this.head;
        for (int i = 0; i < index; i++) {
            curNode = curNode.next;
        }
        Long e = curNode.val;
//        MyNode prevNode = curNode.prev;
//        MyNode nextNode = curNode.next;
//
//        // 修改引用关系,删除 curNode
//        prevNode.next = nextNode;
//        nextNode.prev = prevNode;
        curNode.prev.next = curNode.next;
        curNode.next.prev = curNode.prev;

        size--;
        return e;

    }


    @Override
    public boolean remove(Long e) {
        MyNode curNode = this.head;
        for (int i = 0; i < size; i++) {
            if (curNode.val.equals(e)) {
                //找到元素e后判断其所在位置
                if (i == 0) {
                    this.head = this.head.next;
                    if (this.head != null) {
                        this.head.prev = null;
                    } else {
                        this.last = null;
                    }

                    size--;
                    return true;
                }
                if (i == size - 1) {
                    this.last = this.last.prev;
                    this.last.next = null;
                    size--;
                    return true;
                }

                //走到这儿说明在中间位置,既不是头删,也不是尾删
                MyNode prevNode = curNode.prev;
                MyNode nextNode = curNode.next;
                prevNode.next = nextNode;
                nextNode.prev = prevNode;
                size--;
                return true;
            }

            curNode = curNode.next;
        }
        return false;
    }

    @Override
    public Long get(int index) {
        if(index<0||index>size-1){
            throw new ArrayIndexOutOfBoundsException("下标有误");
        }
        MyNode cur=this.head;
        for (int i = 0; i <index ; i++) {
            cur=cur.next;
        }

        return cur.val;
    }

    @Override
    public Long set(int index, Long e) {
        if(index<0||index>size-1){
            throw new ArrayIndexOutOfBoundsException("下标有误");
        }
        MyNode cur=this.head;
        for (int i = 0; i <index ; i++) {
            cur=cur.next;
        }
        Long olde=cur.val;
        cur.val=e;
        return olde;
    }

    @Override
    public int indexOf(Long e) {
        int i = 0;
        MyNode cur = this.head;
        while (cur != null) {
            if (cur.val.equals(e)) {
                return i;
            }

            i++;
            cur = cur.next;
        }

        return -1;
    }

    @Override
    public int lastIndexOf(Long e) {
        int i = size-1;
        MyNode cur = this.last;
        while (cur != null) {
            if (cur.val.equals(e)) {
                return i;
            }

            i--;
            cur = cur.prev;
        }

        return -1;
    }

    @Override
    public boolean contains(Long e) {
//        MyNode cur=this.head;
//        for (int i = 0; i < size; i++) {
//            if(cur.val.equals(e)){
//                return true;
//            }
//            cur=cur.next;
//        }
//        return false;
        return indexOf(e)!=-1;
    }

    @Override
    //打印链表
    public void display() {
        MyNode cur=this.head;
        while (cur!=null){
            System.out.print(cur.val+" ");
            cur=cur.next;
        }

    }

    @Override
    public boolean isEmpty() {
        return size==0;
    }

    @Override
    public void clear() {
        this.head=this.last=null;
        this.size=0;
    }

四.ArrayList和LinkedList的区别与优缺点

不同点ArrayListLinkedList
存储空间上物理上一定连续逻辑上连续,物理上不一定连续
随机访问(查询)支持O(1)不支持O(N)
插入需要搬移元素,效率低O(N)只需要修改引用指向的方向,时间复杂度O(1)
多次插入空间不够时需要扩容没有容量的概念
应用场景元素高效存储+频繁访问(改查)任意位置的频繁插入删除(增删)

总结

以上两篇内容将ArrayList以及LinkedList通过自己的代码实现了简单的实现,也将其中常用的方法进行了罗列以及讲解,并对两者进行了归纳总结,总的来说就是增删频繁用链表,改查频繁用顺序表两者各有优缺点。后续将会更新与其相关的力扣题。

STL的List链表自行实现 C++中STL的List链表容器的自行实现,自行实现迭代器、类、封装函数等 立即下载

相关推荐

Bertopic库安装(二)

Bertopic库安装

weixin_43392789的博客 4895

list(链表)干货归纳+用法示例

上面的程序创建了一个空的std::list对象mylist,然后向其中添加了四个元素,使用迭代器遍历了链表中的元素,并使用pop_back()、pop_front()、remove()等函数删除了部分元素,最后再次遍历链表中的元素,打印出剩余的元素。需要注意的是,std::list是一个动态分配内存的容器,因此在使用时需要注意内存管理问题,避免内存泄漏。在C++中,list是一种双向链表容器,它可以存储一组数据,而且可以在任意位置进行快速的插入、删除操作。

lzq8090的博客 990

中小公司无线组网实战:用一台H3C AC和普通三层交换,实现办公网AP统一管理

本文详细介绍了中小型企业如何利用H3C AC控制器与普通三层交换机实现无线AP统一管理的实战方案。通过VLAN规划、DHCP配置和AC控制器设置,构建经济高效的办公网络,解决信号覆盖和连接稳定性问题,特别适合50-200人规模的企业部署。

weixin_42531516的博客 383

数据结构---单向链表,双向链表,单向环形链表

链表介绍 链表是以节点的方式来存储,是链式存储 每个节点包含 data 域, next 域:指向下一个节点. 如图:发现链表的各个节点不一定是连续存储. 链表分带头节点的链表和没有头节点的链表,根据实际的需求来确定 修改节点功能 思路(1) 先找到该节点,通过遍历,(2) temp.name = newHeroNode.name ; temp.nickname= newHeroNode.n...

root1994的博客 5842

【BAT32G113-仿真器及脱机烧录器教程-A3-2024/9/19】

提示:此壁纸收集于互联网,如有侵权,请联系作者!今日下班,闲来无事,就与生活中在乎的人闲日常,互相彼此增进一些友谊或爱意情愫!在座的朋友看到这里,有时间,抽抽空,多多联系一下,身边重要的人哟!四种指示灯和一个按钮:MODE->代表红色POWER->代表黄色ACTIVE->代表蓝色STATUS->代表XX(不记得了)黑色按钮:按键上电,会进入升级模式,这里我们一般默认不需要改变!仿真工具-ICE8-PRO介绍隶属于产品分支里。烧写工具-CMS-WRITER8 LITE介绍点击。

星新计划的博客 8274

智能座舱架构与芯片 - (3) 硬件篇 上

在了解智能座舱的基本架构之后,我们有必要针对智能座舱域的硬件平台,软件平台,SOC等进行逐一介绍。从它们的整体结构中去认识最新的智能座舱组成部件,以及主要功能等。如上图,是中央计算-区域控制架构下的智能座舱硬件平台框架图,其中,智能座舱控制器CDC挂载在以太网交换机上,与其他车控域VDC,自驾域ADC,网联设备5G+V2X等通过以太网实现数据交互。而智能座舱域的外部硬件设备还包含有连接子系统音频子系统摄像头子系统显示子系统存储子系统功能安全子系统等。

joanna_xiao的博客 2406

数据结构:03 链式表list

本文有关于数据结构的链式表,两种不同的链式表,带头结点与不带头结点的概念优缺点以及运算实现方式

snowysc的博客 208

liquibase扩展支持达梦数据库

近期项目中需要支持国产数据库,需要liquibase底层支持达梦数据库,记录下操作的详细步骤以便分享。 1.liquibase支持的数据库很多如MySQL, PostgreSQL, Oracle, Sql Server, DB2。但是达梦数据库并不支持,所以需要新建DMDatabase类来适配达梦数据库。达梦语法和Oracle很像所以只需要复制liquibase-core下的Oracle Database做些修改就可了。以下为需要修改的地方 public class DMDatabase extends A

qq_43677719的博客 5472

STL常用容器—list容器(链表)

整理总结C++ STL中list常用容器,主要实现对链表的基本操作,包括增删改查以及翻转、排序等常见操作

weixin_46216674的博客 2333

macOS Jdk1.8安装(目前主流版本的jdk)

添加环境环境变量,类似于windows的高级设置中path配置的环境变量。查看 JAVA_HOME 目录。查看 JDK 版本信息。一直下一步安装就好了。在终端的根目录下运行。

m0_50207524的博客 9356

避坑指南:Zephyr RTOS与nRF Connect SDK环境搭建常见错误及解决方案

本文详细解析了Zephyr RTOS与nRF Connect SDK环境搭建过程中的常见错误及解决方案,涵盖网络问题、代理设置、SEGGER Embedded Studio配置、分支切换等关键环节。针对开发者实际遇到的痛点问题,提供了一系列实用技巧和深度排错方法,帮助高效完成NCS开发环境部署。

weixin_28685287的博客 172

d2025414

用顺序表存储一下,指定区间交换再次遍历顺序表把每个节点的next更改一下讲最后一个节点的next置为null。

yudiipp的博客 219

π0.5部署实战(一) ------ 在Thor上使用NVFP4量化

此篇文章是pi05模型在thor上部署系列文章的第一篇.主要介绍如何对pi05 2.6B LLM(Gemma)使用nvfp4进行量化.所有操作使用开源工具可以先参考进行环境的准备和安装,在上完成以下操作.

happyAnger6的专栏 411

C语言:链表(List)与顺序表(SeqList)

在单链表中,如果要删除指定位置的节点,需要知道指定位置之前的节点,以便修改前一个节点的next指针来跳过当前节点,从而实现删除操作。由于单链表的节点只能通过next指针找到下一个节点,无法直接找到前一个节点,因此删除指定位置的节点比较麻烦,需要遍历链表找到指定位置之前的节点。这是因为在单链表中,如果要在指定位置之前插入节点,需要知道指定位置之前的节点,而单链表的节点只能通过next指针找到下一个节点,无法直接找到前一个节点。1、静态顺序表是在程序运行前就确定了大小的数组,数组的大小是固定的,不能动态改变。

MaoRuofeng的博客 2725

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

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

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

Array List与顺序表

在集合框架中 ArrayList是一个普通类, 实现了List接口【说明】1. ArrayList是以泛型方式实现的,使用时必须要先实例化2. ArrayList实现了RandomAccess接口,表明ArrayList支持随机访问3. ArrayList实现了Cloneable接口,表明ArrayList是可以clone的4. ArrayList实现了Serializable接口,表明ArrayList是支持序列化的。

h3286918168的博客 1902

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

List、ArrayList与顺序表1

在集合框架中,List是一个接口,继承与Collection接口,也继承于Iterable接口。Collection接口中主要规范了后序容器中常用的一些方法Iterable接口表示实现该接口的类是可以逐个元素进行遍历的但是站在数据结构的角度来看,List是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删改查以及变量等操作。

旺旺碎冰冰的博客 1716

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

List——顺序表&链表OJ

Leetcode 21题合并链表、Leetcode118题 杨辉三角、Leetcode141题环形链表、Leetcode142题环形链表Ⅱ

Xx_bjpyy的博客 896

顺序表和链表

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点。快慢指针,即慢指针一次走一步,快指针一次走两步,两个指针从链表起始位置开始运行,如果链表带环则一定会在环中相遇,否则快指针走到链表的末尾。给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在大于或等于 x 的节点之前。一次,之间的距离就缩小一步,不会出现每次刚好是套圈的情况,因此:在慢指针走到一圈之前,

2302_77179144的博客 1153

顺序表与链表

在程序中,经常需要将一组(通常是同为某个类型的)数据元素作为整体管理和使用,需要创建这种元素组,用变量记录它们,传进传出函数等。一组数据中包含的元素个数可能发生变化(可以增加或删除元素)。 对于这种需求,最简单的解决方案便是将这样一组元素看成一个序列,用元素在序列里的位置和顺序,表示实际应用中的某种有意义的信息,或者表示数据之间的某种关系。 这样的一组序列元素的组织形式,我们可以将其抽象为线性表。一个线性表是某类元素的一个集合,还记录着元素之间的一种顺序关系。线性表是最基本的数据结构之一,在实际程序中应

Waller_的博客 596

顺序表和单向链表

本文介绍了顺序表和单向链表的基本概念、设计实现及使用方法。顺序表采用连续存储空间,通过管理结构体实现对数据的增删查改操作。单向链表则通过节点指针连接离散存储的数据,支持头插法和尾插法。两种数据结构各自实现了初始化、插入、删除、遍历和修改等功能,并提供了完整的C语言示例代码。顺序表适用于频繁查询场景,而链表更适合频繁插入删除操作。文章最后给出了两种数据结构的具体应用示例,帮助读者理解其实现原理和实际应用方式。

2401_83334676的博客 2099

Java Collection(1)——List——ArrayList(顺序表)&LinkedList(链表)

因为List是接口,不能直接实例化对象,所以以上的方法只能通过实现List的类的对象来调用,这里只是了解,后面会模拟实现上面的方法ArrayList是Java标准库中的一个类,实现了List接口。顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储,在数组上完成数据的增删查改动态大小:快速随机访问:通过下标访问元素,时间复杂度是O(1)存储任意类型的数据:支持存储任意类型的数据,包括基本数据类型(自动装箱)

2401_89167985的博客 1484

python中的list就是链表吗_数据结构中的顺序表和链表(Python语言)

算法是为了解决实际问题而设计的,数据结构是算法需要处理的问题载体。 Python提供现成的数据结构类型叫做Python的内置数据结构,比如列表、元组、集合、字典。Python系统里面没有直接定义需要自定义的成为Python的扩展数据结构,比如栈、队列等。顺序表的基本形式1.定义:所谓顺序表,就是将元素顺序地存放在一块连续的存储区里,元素间的顺序关系由他们的存储顺序自然表示。 图a,每个元素所占存储...

weixin_39785669的博客 614

顺序表(Seqlist)&链表(List)的基础操作

顺序表和链表是数据结构的基础结构之一,同样也是面试的基础。初学者对于Seqlist和List的增删改查的基础练习,为其后的Tree,HashTable,Binary Linked List,Trigeminal linked list等数据结构打下坚实的基础。

Xiao__Tian__的博客 1万+

数据结构系列三:List+顺序表+ArrayList

List在集合框架中,List是一个接口,继承自Collection也是一个接口,该接口中规范了后续容器中常用的一些方法,具体如下所示Iterable也是一个接口,表示实现该接口的类是可以逐个元素进行遍历的,具体如下:站在数据结构的角度来看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以执行增删查改以及变量等操作List中提供了好的方法,具体如下Arrays;思路:首先判断当前数组存没存放满,如果存放满了,则需要扩容,没存放慢,即可直接存入。

Hi_Lyn的博客 3226

Java中List、ArrayList与顺序表

在集合框架中,List是一个接口,继承自Collection。Collection 也是一个接口,该接口中规范了后序容器中常用的一些方法,具体如下所示:List的官方文档在数据结构的角度看,List就是一个线性表,即n个具有相同类型元素的有限序列,在该序列上可以进行增删查改以及变量等操作。方法解释booleanadd(E e)尾插 evoidadd将 e 插入到 index 位置booleanaddAll尾插 c 中的元素Eremove删除 index 位置元素boolean。

2201_76124988的博客 1182

初阶数据结构—顺序表和链表

新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点。假设A链表相交之前的节点数是a,B链表相交之前的节点数是b,相交(含相交节点)之后的节点是c。由于快指针的速度是慢指针的2倍,相当于同样的时间快指针走过的距离(即链表的长度)是慢指针的两倍。假设链表长度为n,快指针先走k步,那么快慢指针的距离就是k,然后快慢指针同时往后走,那么当快指针遍历完链表时,慢指针走的距离就是n-k。

Awkwardx的博客 1495
上一篇: List——顺序表与链表(一)
下一篇: List——顺序表&链表OJ
彭彭彭摆鱼
博客等级 码龄6年 40粉丝 19原创
评论 18
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彭彭彭摆鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值