数据结构(4)-链表(2)

盘点那些必问的数据结构算法题之链表 0 概述 链表作为一种基础的数据结构,在很多地方会用到。如在Linux内核代码,redis源码,python源码中都有使用。除了单向链表,还有双向链表,本文主要关注单向链表(含部分循环链表题目,会在题目中注明,其他情况都是讨论简单的单向链表)。双向链表在redis中有很好的实现,也在我的仓库中拷贝了一份用于测试用,本文的相关代码在 这里。 https://github.com/shishujuan/data-structure-algorithms 1 定义 先定义一个单向链表结构,如下,定义了链表 阅读详情


上文讲到了链表基础构造以及链表的insertFirst和deleteFirst方法,但是这两个方法只能查询到链头和删除链头,而不能针对链表中的某个节点进行操作,所以本文主要讲解操作链表LinkList的其他两个重要的方法:find方法和delete方法。


一 、链节点的查找

find方法,是通过传入一个数据key,通过这个数据来比对当前current节点(首先默认为first节点)的数据是否符合,如果数据符合,即找到该节点;反之,就是不符合,那么需要把current指向下一个结点,在去进行比对操作;当current.next是空节点时,停止循环停止。
链表查找图解

    //查找链表中的结点
    public Link find(int key){
        Link current = this.first;//将当前指向first结点
        while(current.next != null){
            //链表不为空时
            if(current.data != key ){
                //不是该数据,将current向下移动
                current = current.next;
            }else if(current.data == key){
                System.out.println("已经找到该结点");
                return current;
            }

        }
        System.out.println("没有找到该节点");
        return  null;//没有找到链结点

    }

二、链节点的删除

链节点的删除和链节点的查找相似,首先都是确定一个current变量去标记当前的节点,然后通过数据的对比去确认是不是该节点;但是链节点是删除有不同之处,就是不仅要知道current和current.next节点,还要知道current.pre节点,即当前节点的前节点。因为进行节点的删除操作,本质上就是将current的前节点和后节点相连接,current节点由Java GC机制回收,如图:
链节点的删除图解


    //链结点的删除
    public void delete(int key){
        Link current = this.first;
        Link pre = null;
        while(current.next != null){
            if(current.data == key && current == this.first){
                    //要删除的是链头
                this.first = current.next;
            }else if(current.data != key){
                pre = current;//将当前链结点赋值为链前结点
                current = current.next;
            }else if(current.data == key){
                //找到要删除的current
                pre.next = current.next;//删除,连接两个链结点 pre.next->current.next
                System.out.println("已删除含"+key+"的链结点");
                return;
            }
        }
        System.out.println("找不到链结点");
    }

三、测试

@Test
    public void fun1(){
        LinkList linkList = new LinkList();
        linkList.insertFirst(1);
        linkList.insertFirst(2);
        linkList.insertFirst(3);
        linkList.insertFirst(4);
        linkList.insertFirst(5);
        System.out.println("遍历1");
        linkList.displayLinkList();
        System.out.println("删除两个链头");
        linkList.deleteFirst();
        linkList.deleteFirst();
        System.out.println("遍历2");
        linkList.displayLinkList();

        LinkList.Link link = linkList.find(4);
        System.out.println(link);

        linkList.delete(2);
        linkList.displayLinkList();

    }
}

在这里插入图片描述

Python数据结构与算法(2.4)——双向链表 双向链表与单链表相似,属于顺序表的链式存储结构,单链表和双向链表的唯一区别在于双向链表是用两个指针表示结点间的逻辑关系,增加了一个指向其直接前驱的指针域,这样形成的链表有两条不同方向的链——前驱链和后继链,因此称为双向链表,或称为双链表。本节中我们将重点讨论双向链表及其相关操作的实现。 阅读详情

相关推荐

别再只调包了!深入理解机器学习虚拟筛选中的分子指纹(ECFP/Morgan)

本文深入探讨了ECFP/Morgan分子指纹在机器学习虚拟筛选中的应用与优化策略。通过解析半径参数与比特长度的化学意义,揭示了如何通过参数调优提升模型性能20%以上,特别适用于药物发现领域的高通量筛选。文章还提供了工程实践中的参数优化策略和多指纹融合技术,为开发者提供从理论到实践的全面指导。

weixin_33704234的博客 830

Java数据结构链表(LinkedList详解)

Java数据结构链表部分和顺序表有所相似:首先都扩展了接口List,List里面的方法都会在LinkedList中重写。其次都可以实现数据的增删查改等基础功能。当然ArrayList相较于LinkedList有一定的缺陷,比如果在中间位置插入数据,在中间位置删除数据都比较麻烦,需要移动大量数据!LinkedList可以有效地解决移动数据的难题。当然LinkedList也有自我的缺陷(在C语言阶段已经详细研究,大家可以翻看之前的博客),接下来就一起用Java的目光探究LinkedList。

多敲代码防脱发的博客 1343

基于扩展卡尔曼滤波(EKF)结合到达时间(TDOA)、到达频率(FDOA)实现多无人机无源定位,MATLAB代码

该程序实现了一种结合到达时间差(TDOA)和到达频率差(FDOA)技术的多无人机定位方法,利用扩展卡尔曼滤波(EKF)对单一目标进行定位。程序通过模拟多无人机的运动及其与目标的相对位置,估计目标的状态(位置和速度)。

985工科博士毕业,专攻定位、导航和滤波等算法研究。从业10年,主要使用MATLAB 1267

linux 内核 current,《Linux内核设计与实现》读书笔记(六)- 内核数据结构之链表与队列...

内核数据结构贯穿于整个内核代码中,这里介绍4个基本的内核数据结构。利用这4个基本的数据结构,可以在编写内核代码时节约大量时间。主要内容:链表队列1. 链表链表是linux内核中最简单,同时也是应用最广泛的数据结构。内核中定义的是双向链表。1.1 头文件简介内核中关于链表定义的代码位于: include/linux/list.hlist.h文件中对每个函数都有注释,这里就不详细说了。其实刚开始只要先...

weixin_30174223的博客 258

黑猫带你学UFS协议第13篇:UFS初始化详解(Boot Operation)

本文详细解析了UFS设备的初始化过程,包括部分初始化、加载启动代码(可选)和初始化完成三个阶段。重点介绍了如何通过设备描述符和逻辑单元描述符配置引导特性,以及如何从UFS设备加载启动代码。内容适用于嵌入式硬件和存储领域的开发者。

黑猫奥利奥的博客 3556

高通平台Android 无线 UWB 开发全解析:UWB系统设计、天线与校准全流程指南

为使 UWB 系统达到目标性能,在整个开发流程中遵循一套设计最佳实践至关重要。系统架构:需基于飞行时间(ToF)功能的基准方案(POR)定义系统框图,这是整体系统架构的基础。天线布局:天线位置对性能影响极大,需尽可能贴近 UWB 芯片,以减少信号损耗、保持高传输效率。器件选型:需谨慎选择元器件,推荐使用单刀双掷(SPDT)或双刀双掷(DPDT)开关、UWB 带通滤波器射频同轴测试接头,以保障信号传输路径与测试能力。原理图优化:原理图开发阶段,走线损耗优化极为关键。

专业开发者的博客,一个从事Android WiFi和蓝牙的工程师 171

java中linkedlist链表_java链表linkedlist

java链表linkedlist[2021-02-06 01:59:38]简介:php去除nbsp的方法:首先创建一个PHP代码示例文件;然后通过“preg_replace("/(\s|\&nbsp\;| |\xc2\xa0)/", " ", strip_tags($val));”方法去除所有nbsp即可。推荐:《PHP视频教1、从存储数据结构分析(推荐教程:java入门教程)Arra...

weixin_33891841的博客 421

ubuntu下安装多版本cuda及版本切换教程

首先,从官网下载所需版本的cuda安装包,下载链接。选择对应版本后,会跳转到该版本的配置信息页面。比如我是ubuntu20.04系统,已经安装好了cuda10.0,但是现在还需要用到cuda9.0。那么,在选定版本后,配置信息如下图所示(由于Version选项中没有20.04,因此我们随便选一个即可,这里选的16.04,这一选项不会影响后面的安装),Installer Type选择为runfile(因为使用deb文件进行安装的话,可能会将已经安装的较新的显卡驱动给替换掉),选择好之后点击Base Insta

zeeq的博客 3万+

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

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

qq_20054391的博客 3092

论deepseek软件底层原理

如处理医学文本时,将任务分配给擅长医学知识处理的专家,避免通用模块处理的低效性,极大提升计算效率与任务处理的针对性。教师模型复杂且强大,学生模型结构简单。协作处理:多模块协作时,建立数据流通与交互机制,各模块按顺序或并行处理数据,不断传递与更新中间结果,共同完成复杂任务。(一)输入处理与任务判断 输入预处理:接收输入数据,如用户文本提问,首先进行清洗,去除噪声数据、特殊字符等。任务分类:通过MoE架构“路由器”,依据输入数据特征,判断任务所属领域与类型,如文本分类、情感分析等,为后续处理模块选择提供依据。

欢乐打代码! 2738

虚幻商城 Quixel 免费资产一键入库

在免费领取所有Megascans之后,我们只是有了获取 Quixel Megascans 资产的资格,但是没有入 Fab 库,本文将讲解通过脚本将 Quixel 所有资产入库 Fab。

一碗清深的博客 3359

数据结构作业 2.4:静态链表

【代码】数据结构作业 2.4:静态链表。

2401_86687765的博客 181

化工模拟与优化软件:Aspen HYSYS二次开发_(15).工业应用与项目管理

项目背景、目标和主要流程。

kkchenjj的博客 1131

【数据结构】2-4 双链表

双链表在单链表的基础上增加了指向前驱节点的指针,其节点结构包括数据域、前驱指针和后驱指针。双链表的初始化涉及创建头节点并设置其前驱和后驱指针为NULL。插入操作在指定节点后插入新节点,需调整新节点及其前后节点的指针。删除操作移除指定节点的后继节点,并调整相关指针及释放节点空间。双链表的遍历操作,包括按位查找和按值查找,由于不能随机存取,必须从头节点开始顺序访问,时间复杂度为O(n)。这些操作共同构成了双链表的基本功能,使其在数据结构中具有灵活性和高效性。

weixin_43192805的博客 731

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

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

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

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

数据结构 第4-2讲 双向链表

数据结构 第4-2讲 双向链表 链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么怎么表示逻辑上的相邻关系呢? 可以给每个元素附加一个指针域,指向下一个元素的存储位置。这种链表称为单向链表,简称单链表,如图1所示: 图1 单链表 单链表中每个结点除了存储自身数据之后,还存储了下一个结点的地址,因此可以轻松访问下一

rainchxy的博客 2013

计算机控制技术及应用

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

【数据结构】2-3-4 单链表的建立

尾插法和头插法是建立单链表的两种常见方法。尾插法将新节点插入链表尾部,通过维护一个指向尾节点的指针实现。具体步骤包括:创建头节点,为新节点分配空间并赋值,将尾节点的指针指向新节点,最后将新节点设为尾节点。头插法则将新节点插入链表头部,步骤包括:创建头节点并初始化链表为空,为新节点分配空间并赋值,将新节点的指针指向原头节点的下一个节点,最后将新节点设为头节点。两种方法均通过循环输入数据,直到输入特定值(如9999)结束。

weixin_43192805的博客 655

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

2.4 数据结构——循环链表及双向链表

循环链表及双向链表

weixin_45523296的博客 1120

2.6 数据结构 --1.4 链表

数据结构子目录https://www.jianshu.com/p/a344fa483655 顺序表 顺序表按照存储的元素类型,可以分为两种,一种是单类型顺序表,一种是多类型顺序表。 Python中的列表和元组便是多类型顺序表,多类型顺序表的内存不是连续开辟的。 数组是单类型顺序表。 顺序表的弊端 需要先预知数据大小来开辟空间,如果需要扩充就需要对数据进行迁移。 链表 相比于顺序表,...

寒暄的博客 236

数据结构 C 代码 2.4: 静态链表

nodes 存储节点, used 存储空间使用情况, 0 表示空闲, 1 表示被占用. next 是一个整数, 表示相对地址. 在操作系统中, 应该是绝对地址. 这里用 -1 表示 NULL. nodes[0] 永远存储头节点 并没考虑多个链表共享同一片空间的情况, 但这是真实操作系统需要面对的. paraListPtr->nodes[paraListPtr->nodes[p].next].data 这种代码有一点点复杂, 懂了就好办. 这个代码的调拭也就 10 分钟.

qq_61649579的博客 566

数据结构2.4:双向链表

可以向前或者向后查找可以自我删除。

qq_55630615的博客 232

数据结构2.4静态链表

在C语言中,静态链表的表现形式即为结构体数组,结构体变量包括数据域data和游标CUR。 这种存储结构,仍需要预先分配一个较大的空间,但在作为线性表的插入和删除操作时不需移动元素,仅需修改指针,故仍具有链式存储的主要优点。 接下来进行相关操作展示 定义静态链表 #include <stdio.h> #include <malloc.h> #define DEFAULT_SIZE 5 typedef struct StaticLinkedNode{ char

qq_62644791的博客 1147

数据结构 2-3-4 静态链表

一、概念 静态链表相当于混合了数组和链表,单独的链表,使用next指针指向内存空间中下一个节点的位置来实现连接的,而数组中是用相对位置来实现,将二者混合,保留指向下一个的指针,但这个指针不是指针,而是下一个节点所在数组位置的下标,相当于在一个数组内实现了链表的操作。 二、定义 静态链表节点的定义只做出了一个改动,指向下一个的不再是指针,而是一个整形变量,这个变量用于记录下一个节点所在位置的数组下标。 struct LNode{ int num; int next; }; 三、代码实现 静态链表的实现,

博客标题不能为空我也没办法 293

c++ 链表长度_数据结构(4)-链表-Part2

输出链表中间的元素方法1(遍历链表两次)遍历链表一次,得到链表的长度n。再次遍历链表,输出n/2位置的元素。方法2(遍历链表一次)创建两个节点slow和fast。每次移动fast指针遍历两个节点;每次移动slow指针变量一个节点。当fast指针指向NULL(链表有偶数个节点),或者fast为NULL(链表有奇数个节点)时,slow节点就是链表的中间节点。C++程序实现(方法2),时间复杂度为 :...

weixin_39557813的博客 839

王道数据结构链表2-2.4

//带头结点的链表删除最小元素 note:if语句里写不出时可先往下写,写不符合条件时的语句 #include<iostream> using namespace std; typedef struct lnode { int data; struct lnode* next; }lnode,*linklist; int a[5] = { 2,1,3,4,5 }; int n = 5; void buildlist(linklist& L) { L = (lnode*)mal

m0_51541113的博客 133

数据结构4.2单链表的反转

题目: 思路: 1.先定义一个节点reverseHead=new HeroNode(); 2.从头到尾便利原来的链表,每遍历一个节点,就将其取出,并放在新的链表reverseHead的最前端。 3.原来的链表的head.next=reverseHead.next 测试: 定义的HeroNode类: 定义的显示列表的函数list:...

weixin_43899452的博客 177

C语言数据结构(4)单链表专题2.单链表的应用

单链表专题(2)单链表的应用

2301_79907403的博客 1011
上一篇: 算法学习笔记(4)-快速排序
下一篇: Thymeleaf的th:href传递多个参数出现乱码
BoringRong
BoringRong 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄9年 2万+粉丝 386原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

BoringRong

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

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

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

打赏作者

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

抵扣说明:

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

余额充值