单链表的查找(按值查找、按位查找)(数据结构与算法)

什么是单链表?

单链表是一种常见的链式数据结构,用于存储和操作数据元素的集合。它由一系列的节点组成,每个节点包含两个部分:数据域和指针域。

单链表的每个节点包含了存储数据的数据域,以及指向下一个节点的指针域。通过这些指针域,节点之间可以按顺序连接起来,形成一个链式结构。链表的最后一个节点通常指向一个特殊的空节点(NULL或nullptr),表示链表的结束。

相比于数组,链表的一大优势是它的动态性。在链表中,节点的添加、删除可以通过修改指针的指向来完成,不需要像数组那样进行元素的移动。这使得链表在插入和删除操作频繁的场景中具有更高的效率。

链表的一个缺点是访问节点需要从头节点开始依次遍历,因为链表中的节点并不是在内存中连续存储的。这导致了链表的访问时间复杂度为O(n),其中n是链表的长度。相比之下,数组可以通过索引直接访问元素,时间复杂度为O(1)。

在这里插入图片描述
在这里插入图片描述

1. 按位查找

  1. 单链表按位查找是指根据节点在链表中的位置(即节点序号或下标)来查找节点的操作。通常情况下,我们需要查找的节点序号是从1开始计数的,即第1个节点、第2个节点、第3个节点等。

  2. 单链表按位查找的基本思路是从链表头节点开始,遍历链表,直到找到第k个节点,或者链表遍历结束。如果链表遍历结束仍未找到第k个节点,则返回空指针。
    平均时间复杂度:O(n)

//按位查找
LNode *GetElem(LinkList L, int i)
{if(i < 0)     //判断i是否合法return NULL;LNode *p;  //指针p指向当前扫描到的结点int j = 0;  //当前p指向的是第几个结点p = L;     //L指向头结点, 头结点是第0个结点(不存数据)while(p != NULL && j < i) //循环找到第i个结点{p = p->next;    //让p指针依次往后移j++;}return p;
}

i 的值有两种极端情况,分别是 i 取最小0 和取最大5

若 i = 0; while循环不符合,返回return p; 此时p指针会指向头结点, 如下图所示

在这里插入图片描述

若 i = 5; j++递增到5后,此时p指针指向链表末尾空指针NULL,p != NULL不满足,退出while循环,p返回NULL

在这里插入图片描述

所以当 i 不合法时,最终返回的都是NULL, 那么当别人调用此基本操作时,只要判断下此次的返回值是不是NULL, 就能知道这次的按位查找是否查找成功,这样的算法才具有健壮性。

既然我们实现了按位查找的操作,那么以后按位插入和按位删除时,就可以直接调用基本操作来实现。如下图所示:
基本封装的好处:简洁易维护

在这里插入图片描述

2. 按值查找

时间复杂度:O(n)
单链表按值查找需要遍历链表的每一个节点,直到找到节点的值等于目标值,或者遍历结束没有找到目标值,返回空指针。

  • 在按值查找单链表时,需要注意以下几点:
  1. 单链表查找需要遍历整个链表,时间复杂度为 O(n),其中 n 是链表节点的个数。
  2. 当链表为空时,需要特别处理。
  3. 如果目标值在链表中不存在,可能需要额外处理,比如返回一个空指针,或者打印出 “Not Found” 等提示信息。
  4. 需要根据具体问题和代码实现,特别注意链表头节点指针的正确性,以及节点指针的移动和连接等操作。

假设本例中的ElemType是int类型

//按值查找, 找到数据域 == e 的结点
LNode *LocateElem(LinkList L, ElemType e) 
{LNode *p = L->next;//从第1个结点开始查找数据域为e的结点while(p != NULL && p->data != e)p = p->next;return p;    //找到后返回该结点指针,否则返回NULL
}

若e = 8, 当 p指向第一个结点时,5 != 8,p移向下一个结点

在这里插入图片描述

当p移动到第2个结点时,找到数据8,此时while循环退出,返回 return p

在这里插入图片描述

当e = 6时,p指针不断往后移,当p指向NULl时,while循环不满足,退出循环,返回return p
当LocateElem()函数的调用者接受到NULL时,就说明并不存在数据域等于6的结点。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. 求单链表的长度

时间复杂度:O(n)

//求表的长度
int length(LinkList L)
{int len = 0; //统计表长LNode *p = L;while(p->next != NULL){p = p->next;len++;}return len;
}

在这里插入图片描述

4. 知识回顾

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/179089.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深度学习之基于YoloV5的道路地面缺陷检测系统(UI界面)

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、道路地面缺陷检测系统四. 总结 一项目简介 基于YoloV5的道路地面缺陷检测系统利用深度学习中的目标检测算法&#xff0c;特别是YoloV5算法&am…

新体验:万圣节夜晚的新游戏!--愤怒的南瓜

引言&#xff1a; Chatgpt4.0 所带来的冲击似乎远超出人们想象&#xff0c;网页小游戏《愤怒的南瓜》在昨日&#xff08;万圣节夜晚&#xff09;火爆了外网。一位名为 Javi Lopez 的外国小哥使用 Midjourney、DALL•E 3 和 GPT-4 打开了一个无限可能的世界&#xff0c;重新演绎…

Git统计个人提交代码行数

目录 一、git bash打开二、查看个人提交的代码行数统计三、查看项目每个人提交的代码行数统计四、查询所有用户的提交总次数五、统计用户一段时间内的提交代码量 在实际开发中&#xff0c;常常会想查看自己对于某个项目的贡献&#xff0c;管理者会查看项目下各成员的贡献&#…

回归预测 | Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测

Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测 目录 Matlab实现POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.POA-CNN-SVM鹈鹕算法优化卷积神经网络-支持向量机的多变量回归…

入门指南|机器人流程自动化(RPA)在数字营销中的8大应用

虽然现在的话题度不及ChatGPT&#xff0c;但近两年最火的MarTech工具非RPA莫属。今天我们就来看看&#xff1a;资本宠儿、号称世界500强中超过70%的企业都在使用、老板心中最佳员工RPA到底是什么&#xff1f;以及在营销与运营中有哪些应用&#xff1f; 01 RPA是什么&#xff1f…

2m照片用手机怎么照?三个方法随心选!

在用手机拍照的时候&#xff0c;我们会发现拍出的照片尺寸都很大&#xff0c;占用手机的存储空间较多&#xff0c;而自己又不需要如此高清晰度的照片&#xff0c;那么如何解决这个问题呢&#xff1f;下面介绍了三种方法。 方法一&#xff1a;调整手机拍照的设置选项 1、打开手…

IDEA使用-通过Database面板访问数据库

文章目录 前言操作过程注意事项1.无法下载驱动2.“Database”面板不显示数据库表总结前言 作为一款强大IDE工具,IDEA具有很多功能,本文将以MariaDB数据库访问为例,详细介绍如何通过IDE工具的Database面板来访问数据库。 操作过程 不同的版本操作会略有差异,这里我们用于演…

[common c/c++] ring buffer/circular buffer 环形队列/环形缓冲区

前言&#xff1a; ring buffer / circular buffer 又名环形队列 / 环形缓冲区&#xff0c;其通过开辟固定尺寸的内存来实现反复复用同一块内存的目的。由于预先开辟了固定尺寸的内容&#xff0c;所以当数据满的时候&#xff0c;可以有两种处理方式&#xff0c;具体使用哪一种按…

第2篇 机器学习基础 —(3)机器学习库之Scikit-Learn

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Scikit-Learn&#xff08;简称Sklearn&#xff09;是Python 的第三方模块&#xff0c;它是机器学习领域当中知名的Python 模块之一&#xff0c;它对常用的机器学习算法进行了封装&#xff0c;包括回归&#xff08;Regressi…

【windows Docker镜像占用许多空间:将数据迁移到D盘】

查看其占据的空间 导出数据到D盘 首先退出docker C:\Users\lxh>wsl --shutdownC:\Users\lxh> C:\Users\lxh>wsl --export docker-desktop-data docker-desktop-data.tar 正在导出&#xff0c;这可能需要几分钟时间。 操作成功完成。C:\Users\lxh> C:\Users\lxh&g…

软件无线电处理平台解决方案:330-基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡

基于FMC接口的Kintex-7 XC7K325T PCIeX4 3U PXIe接口卡 一、板卡概述 本板卡基于Xilinx公司的FPGAXC7K325T-2FFG900 芯片&#xff0c;pin_to_pin兼容FPGAXC7K410T-2FFG900 &#xff0c;支持PCIeX8、64bit DDR3容量2GByte&#xff0c;HPC的FMC连接器&#xff0c;北京太速科…

安达发|汽车零配件在生产上常常会遇到哪些困难?

汽车零配件在生产上常常会遇到许多困难&#xff0c;这些困难涉及到技术、质量、成本和供应链等多个方面。以下是一些常见的困难及其解决方案&#xff1a; 1.技术难题&#xff1a;汽车零配件的生产需要高度的技术支持&#xff0c;尤其是在新材料、新工艺和新设备的应用上。解决技…

【蓝桥每日一题]-二分类型(保姆级教程 篇3) #路标设置 #跳石头

今天接着讲二分题型 目录 题目&#xff1a;路标设置 思路&#xff1a; 题目&#xff1a;跳石头 思路&#xff1a; 题目&#xff1a;路标设置 思路&#xff1a; 求&#xff1a;放n个路标后的最小空旷指数 二分查找&#xff1a;对空旷指数进行二分 二分依据: 该空旷指数下放…

XR Interaction ToolKit

一、简介 XR Interaction Toolkit是unity官方的XR交互工具包。 官方XRI示例地址&#xff1a;https://github.com/Unity-Technologies/XR-Interaction-Toolkit-Examples 2023.3.14官方博客&#xff0c;XRIT v2.3 https://blog.unity.com/engine-platform/whats-new-in-xr-int…

Windows Server 2008安装

1.典型 2.稍后安装操作系统 3.Microsoft Windows 4.尽量虚拟机名称也改一下&#xff0c;我忘记改了 5. 默认40G差不多了&#xff0c;不用修改了 6.直接点完成 7.配置处理器和镜像 8.中文简体 9.现在安装 10.第一个就行&#xff08;完全安装&#xff09; 11.我接受&#xff0c…

基于stm32F4的智能宠物喂食器的设计:LVGL界面、定时喂食喂水通风

宠物喂食器 一、功能设计二、元器件选型三、UI设计四、原理图设计五、源代码设计六、成品展示 实物链接&#xff1a;https://m.tb.cn/h.5iCUX6H?tkPL65WXCEipQ CZ3457 一、功能设计 1、设计一个触摸屏作为人机交互 2、通过触摸屏设置时间定时喂食喂水通风 3、获取当前水槽的…

PlantSimulation安装帮助文档端口被占用的解决办法

PlantSimulation安装帮助文档端口被占用的解决办法 从PlantSimulaiton&#xff08;TPS&#xff09;2201开始帮助文档开始使用在线&#xff0c;如果使用本地则需要安装本地文档服务器。但是在安装过程中你可能会遇到&#xff0c;5000断开被占用的情况。解决办法如下&#xff1a…

axios 实现请求 loading 效果

前景提要&#xff1a; ts 简易封装 axios&#xff0c;统一 API 实现在 config 中配置开关拦截器 loading 分为全屏 loading 和局部 loading。 axios 中设置 loading 只能设置全屏 loading&#xff0c;因为局部 loading 需要当前局部的 dom&#xff0c;在 axios 中显然拿不到发…

取消Excel打开密码的两种方法

Excel设置了打开密码&#xff0c;想要取消打开密码是由两种方法的&#xff0c;今天分享这两种方法给大家。 想要取消密码是需要直到正确密码的&#xff0c;因为只有打开文件才能进行取消密码的操作 方法一&#xff1a; 是大家常见的取消方法&#xff0c;打开excel文件之后&a…

c++装饰器模式

前言 装饰器模式&#xff0c;就是可以对一个对象无限装饰一些东西&#xff0c;而且可以没有顺序。比如一个人可能只会说出他的名字&#xff0c;但是可以让他再说哈哈&#xff0c;可以说完哈哈之后再说哇哇。如何后面又不想装饰了&#xff0c;不需要改类原来的代码&#xff0c;…