当前位置: 首页 > news >正文

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

什么是单链表?

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

单链表的每个节点包含了存储数据的数据域,以及指向下一个节点的指针域。通过这些指针域,节点之间可以按顺序连接起来,形成一个链式结构。链表的最后一个节点通常指向一个特殊的空节点(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. 知识回顾

在这里插入图片描述

相关文章:

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

什么是单链表&#xff1f; 单链表是一种常见的链式数据结构&#xff0c;用于存储和操作数据元素的集合。它由一系列的节点组成&#xff0c;每个节点包含两个部分&#xff1a;数据域和指针域。 单链表的每个节点包含了存储数据的数据域&#xff0c;以及指向下一个节点的指针域。…...

Qt 6.6 发布

@TOC 前言 Qt 6.6 发布于2023年10月10日 https://www.qt.io/blog/qt-6.6-releasedQt 6.6 系列源码下载 https://download.qt.io/official_releases/qt/6.6/Qt 在线安装器下载 https://download.qt.io/official_releases/online_installers/国内镜像下载 在线安装器(维护工具)…...

unity工程

1首先我们来熟悉一下Unity每个文件夹的作用 1.assets&#xff1a;工程资源文件夹 2.library&#xff1a;库文件夹 3.logs&#xff1a;日志文件夹 4.obj&#xff1a;编译产生中间文件 5.packages&#xff1a;包配置信息 6&#xff1a;projectsettings&#xff1a;工程设置…...

蓝桥杯官网练习题(地址转换)

题目描述 Excel 是最常用的办公软件。每个单元格都有唯一的地址表示。比如&#xff1a;第 12 行第 4 列表示为&#xff1a;"D12"&#xff0c;第 5 行第 255 列表示为"IU5"。 事实上&#xff0c;Excel 提供了两种地址表示方法&#xff0c;还有一种表示法叫…...

力扣labuladong——一刷day19

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、力扣303. 区域和检索 - 数组不可变二、力扣304. 二维区域和检索 - 矩阵不可变 前言 巧用前缀和 前缀和技巧适用于快速、频繁地计算一个索引区间内的元素之…...

MyBatis无法读取XML中的Method的乌龙事件

事件背景 同事反馈&#xff0c;相同的jar包&#xff0c;在多人本地的电脑、多台服务器中&#xff0c;都是可以正常启动的&#xff0c;只有在其中一台服务器&#xff0c;简称它为A&#xff0c;无法启动&#xff0c;因为启动后的初始化操作中有一个调用mybatis方法的操作&#x…...

LeetCode----76. 最小覆盖子串

 题目 给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保…...

app逆向入门之车智赢

声明&#xff1a;本文仅限学习交流使用&#xff0c;禁止用于非法用途、商业活动等。否则后果自负。如有侵权&#xff0c;请告知删除&#xff0c;谢谢&#xff01;本教程也没有专门针对某个网站而编写&#xff0c;单纯的技术研究 目录 案例分析技术依赖参数分析效果展示代码分享…...

LeetCode——数组 移除元素(Java)

移除元素 简介[简单] 27. 移除元素[简单] 26. 删除有序数组中的重复项[简单] 283. 移动零[简单] 844. 比较含退格的字符串[简单] 977. 有序数组的平方 简介 记录一下自己刷题的历程以及代码。写题过程中参考了 代码随想录。会附上一些个人的思路&#xff0c;如果有错误&#x…...

enum和Collection.stream()你这样用过么

最近在做一个数据图表展示的功能&#xff0c;显示订单近七天或者近半月的数量和金额。可以理解成下图所示的样子&#xff1a; 我是用枚举和集合的stream方法实现的数据初始化和组装&#xff0c;枚举用来动态初始化时间范围&#xff0c;集合的stream方法来将初始化的数据转换成…...

unittest与pytest的区别

Unittest vs Pytest 主要从用例编写规则、用例的前置和后置、参数化、断言、用例执行、失败重运行和报告这几个方面比较unittest和pytest的区别: 用例编写规则 用例前置与后置条件 断言 测试报告 失败重跑机制 参数化 用例分类执行 如果不好看&#xff0c;可以看下面表格&…...

YOLOv7优化策略:IOU系列篇 | 引入MPDIoU,WIoU,SIoU,EIoU,α-IoU等创新

💡💡💡本文独家改进:MPDIoU,WIoU,SIoU,EIoU,α-IoU等二次创新,总有一种适合你的数据集 MPDIoU,WIoU,SIoU,EIoU,α-IoU | 亲测在多个数据集能够实现大幅涨点 收录: YOLOv7高阶自研专栏介绍: http://t.csdnimg.cn/tYI0c ✨✨✨前沿最新计算机顶会复现 …...

SQL Server2000mdf升级SQL Server2005数据库还原

SQL Server2000数据库还原sqlserver 2000mdf升级 sqlserver 2008数据库还原SQL Server2005数据库脚本 sqlserver数据库低版本升级成高版本 sqlserver数据库版本升级 数据库版本还原 如果本机安装了sqlserver2012或者sqlserver2019等高版本 怎么样才能运行sqlserver2000的数据库…...

webSocket推送太快导致前端渲染卡顿问题优化

优化思路&#xff1a; 把webSocket接收到的数据用一个数组存起来&#xff0c;达到一定长度再统一渲染&#xff0c;可根据推送数据的速度适当调解数组长度限制&#xff0c;如果一段时间内改数组长度打不要渲染条件&#xff0c;就用定时器之间渲染 data() {return {tempDataWsLi…...

(Java)泛型总结

泛型类 public class Student<E> {private E a;public Student(E a){this.aa;}public void show(){System.out.println(a);} } 泛型方法 public <E> void show(E a){System.out.println(a);} 泛型接口 public interface Inter <T>{void show(T a); } 类…...

C++ Package继承层次,采用继承实现快递包裹的分类计价(分为空运2日达、陆运3日达)。

一、问题描述&#xff1a; Package继承层次&#xff0c;采用继承实现快递包裹的分类计价&#xff08;分为空运2日达、陆运3日达&#xff09;。自定义一个或多个快递公司&#xff0c;自定义计价方法&#xff0c;设计合适、合理的界面文本提示&#xff0c;以广东省内某市为起点&…...

中文大语言模型汇总

推荐一篇非常棒的github&#xff1a;Awesome-Chinese-LLM 另附语言模型排行榜&#xff1a;FastChat 里面总结了几乎所有目前主流的中文大语言模型。在此记录一下&#xff0c;方便以后慢慢学习。...

GEE:GEE中实现简单计算器

作者&#xff1a;CSDN _养乐多_ 本文记录了在 Google Earth Engine&#xff08;GEE&#xff09;上实现简单计算器的代码。 APP链接&#xff1a;https://949384116.users.earthengine.app/view/simplecalculator 文章目录 一、完整代码二、代码链接 一、完整代码 // 定义初始…...

概念解析 | 神经网络中的位置编码(Positional Encoding)

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:Positional Encoding 神经网络中的位置编码(Positional Encoding) A Gentle Introduction to Positional Encoding in Transformer Models, Part 1 1.背景介绍 在自然语言处理任…...

【ubuntu】搭建lamp架构

一、准备工作 1、更新源 apt-get updateapt #就是一个管理包的工具&#xff0c;理解为centos中的yum update #表示让apt执行更新的操作&#xff0c;更新的内容为软件列表。#为什么要更新软件列表&#xff1f; 就时本地会隔断时间进行同步镜像站的资源包&#xff0c;但是我…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

C++:std::is_convertible

C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

从零实现STL哈希容器:unordered_map/unordered_set封装详解

本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说&#xff0c;直接开始吧&#xff01; 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

成都鼎讯硬核科技!雷达目标与干扰模拟器,以卓越性能制胜电磁频谱战

在现代战争中&#xff0c;电磁频谱已成为继陆、海、空、天之后的 “第五维战场”&#xff0c;雷达作为电磁频谱领域的关键装备&#xff0c;其干扰与抗干扰能力的较量&#xff0c;直接影响着战争的胜负走向。由成都鼎讯科技匠心打造的雷达目标与干扰模拟器&#xff0c;凭借数字射…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA

浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求&#xff0c;本次涉及的主要是收费汇聚交换机的配置&#xff0c;浪潮网络设备在高速项目很少&#xff0c;通…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)

推荐 github 项目:GeminiImageApp(图片生成方向&#xff0c;可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...