菜鸟玩算法·数据结构与算法·第2期·链表操作-单向链表

阿里巴巴(菜鸟) - 算法工程师(机器学习)提前批笔试面试总结 前面一直在准备出国留学申请,中间投递了华为、腾讯、阿里三家公司。幸运的是拿到了华为多媒体算法岗, 腾讯机器学习算法岗,阿里巴巴菜鸟物流算法岗。接下来将投入到论文发表、计算机名校申请中。 Attention1:本文是博主准备阿里秋招的笔记内容。 Attention2:本文只为了记录自己的经历,不适用金字塔层级的大神、大佬。 1.申请职位描述 阿里巴巴-菜鸟物流:算法工程师(机器学习) 其... 阅读详情

链表操作

    我们在讲C++的时候,详细讲解过数组。并指出数组的大小是提前声明好以及在内存中存储是连续的地址,正式因为是连续地址,这就导致了一些问题。例如,我们如果要在数组中间添加一些数据,则需要后面所有的数据都要随着移动。这就给数据处理带来了很多不便,因此针对这个问题,数据结构中提供了链表操作。

    链表操作主要包括六种:单向链表、双向链表、循环链表、跳跃链表、自组织链表、稀疏链表。下面说一下链表当中的基本单元,链表当中主要包括内容信息和指向链表指针。我们从下面图来详细讲解:

                                                                    

     从上图我们可以看出,指针P指向链表中10所在节点1的内存地址;节点1中的指针指向节点2(数据8)所在地址;节点2中的指针指向节点3(数据50)所在地址,节点3中的指针指向空地址。

单向链表

    单向链表,我们从名字上就应该意识到,这个其实就是一直向同一方向指向的链表。下面我们通过程序来查看:

#include <iostream>

using namespace std;

//单向链表类
class ListClass
{
public:
	ListClass();
	~ListClass();
	ListClass(int iTmpVar, ListClass *iTmpList);


	int info;
	ListClass *next;

private:

};

ListClass::ListClass()
{
	next = 0;
}

ListClass::ListClass(int iTmpVar, ListClass *iTmpList = NULL)
{
	info = iTmpVar;
	next = iTmpList;
}

ListClass::~ListClass(){}

int main()
{
	ListClass *listVar = new ListClass(10, NULL); 
	listVar->next = new ListClass(11, NULL);
	listVar->next->next = new ListClass(12, NULL);

	//访问每个链表的信息,并进行打印
	cout << listVar->info << "  " << listVar->next->info  << "  "<< listVar->next->next->info<< endl;

	getchar();
}

运行结果

10  11  12

我们可以看到,单向链表如果只保留head头指针,要访问最后的数据则需要依次访问中间所有的指针,直到指向最后的数据才可以。因此,我们需要引入指向末尾的指针tail。下面我们来看一下添加了head和tail指针后的实例:


#include <iostream>
#include <list>

using namespace std;

//单向链表节点类
class ListNodeClass
{
public:
	ListNodeClass();
	~ListNodeClass();
	ListNodeClass(int iTmpVar, ListNodeClass *iTmpList);


	int info;
	ListNodeClass *next;

private:

};

//单向链表类
ListNodeClass::ListNodeClass()
{
	next = 0;
}

ListNodeClass::ListNodeClass(int iTmpVar, ListNodeClass *iTmpList = NULL)
{
	info = iTmpVar;
	next = iTmpList;
}

ListNodeClass::~ListNodeClass() {}


class InitListClass
{
public:
	InitListClass();
	~InitListClass();
	void addToHead(int iTmp);
	void addToTail(int iTmp);
	int deleteFromHead();
	int deleteFromTail();
	void deleteNode(int iTmp);
	bool isInList(int iTmp) const;
private:
	ListNodeClass *head, *tail;
};

/*初始头和尾指针为空指针*/
InitListClass::InitListClass()
{
	head = tail = NULL;
}

/*添加头信息*/
void InitListClass::addToHead(int iTmp)
{
	head = new ListNodeClass(iTmp, head);
	if (tail == NULL)
		tail = head;    //头和尾指向同一地址
}

/*添加尾信息*/
void InitListClass::addToTail(int iTmp)
{
	if (tail != NULL)
	{
		tail->next = new ListNodeClass(iTmp); //添加下一节点
		tail = tail->next;
	}
	else
		head = tail = new ListNodeClass(iTmp);
}

/*从头删除信息*/
int InitListClass::deleteFromHead()
{
	int iReturnInfo = head->info;
	ListNodeClass *tmpClass = head;
	if (head == tail)
		head = tail = NULL;
	else
		head = head->next;
	delete tmpClass;
	return iReturnInfo;
}


/*从尾删除信息*/
int InitListClass::deleteFromTail()
{
	int iReturnInfo = tail->info;
	if (head == tail) //链表中只有一个节点
	{
		delete head;
		head = tail = NULL;
	}
	else
	{
		ListNodeClass *tmpClass;
		for (tmpClass = head; tmpClass->next != tail; tmpClass = tmpClass->next) //循环指向尾节点上一节点
			delete tail;
		tail = tmpClass;
		tail->next = NULL;
	}
	return iReturnInfo;
}


/*删除节点*/
void InitListClass::deleteNode(int iTmp)
{
	if (head != NULL)
	{
		if (head == tail && iTmp == head->info)   //链表只有一个数据
		{
			delete head;
			head = tail = NULL;
		}
		else if (iTmp == head->info)    //链表超过一个数据,其中删除的节点为数据头  
		{
			ListNodeClass *tmpClass = head;
			head = head->next;
			delete tmpClass;
		}
		else
		{
			ListNodeClass *predClass, *tmpClass;
			for (predClass = head, tmpClass = head->next; tmpClass != NULL && !(tmpClass->info == iTmp); predClass = predClass->next, tmpClass = tmpClass->next);
			if (tmpClass != NULL)
			{
				predClass->next = tmpClass->next;
				if (tmpClass == tail)
					tail = predClass;
				delete tmpClass;
			}
		}
	}
}
/*判断链表中是否存在指定数据*/
bool InitListClass::isInList(int iTmp) const
{
	ListNodeClass *tmpClass;
	for (tmpClass = head; tmpClass != NULL && !(tmpClass->info == iTmp); tmpClass = tmpClass->next);  //遍历链表中数据,并进行一一对比
	return tmpClass != NULL;
}
InitListClass::~InitListClass() {}

int main()
{
	InitListClass *listVar = new InitListClass(); //创建链表
	listVar->addToHead(10);
	listVar->addToTail(9);  //在尾部添加数据
	listVar->addToTail(8);

	//cout << listVar->deleteFromHead() << endl;   //从头开始删除数据
	//cout << listVar->deleteFromHead() << endl;
	//cout << listVar->deleteFromHead() << endl;
	listVar->deleteNode(8);                       //删除节点内的8信息
	cout << listVar->isInList(8) << endl;         //判断数据是否存在
	getchar();
}

运行结果

0

下面我们来聊一聊链表中的插入、删除、查找操作:

更多《计算机视觉与图形学》知识,可关注下方公众号:

 

从OAuth到DID:Web4.0身份验证协议的技术演进图谱 在数字身份体系从Web2.0向Web4.0跨越的进程中,身份验证协议正经历着从中心化授权到自主主权的范式转移。本文通过对比OAuth 2.0、OpenID Connect等传统方案与W3C DID、ION等去中心化协议的技术架构,揭示身份验证技术在性能、安全、隐私三大维度的代际差异。基于对GitHub、欧盟数字身份钱包等典型系统的实测数据分析,量化评估中心化授权服务器的单点故障风险与DID链上验证的吞吐量瓶颈。结合零知识证明、分布式密钥管理等前沿技术,为开发者提供面向Web4.0的渐进式身份架构迁移策略。 阅读详情

相关推荐

手把手教你用Cadence仿真12bit SAR ADC:从电路图到FFT频谱分析(含Simc 18mmrf工艺文件)

本文详细介绍了使用Cadence仿真12bit SAR ADC的全流程,包括电路搭建、仿真环境配置、瞬态仿真优化及FFT频谱分析。基于Simc 18mmrf工艺文件,提供从电路图到性能验证的实战指南,特别分享工程实践中的排错技巧和优化策略,帮助工程师高效完成ADC设计验证。

weixin_30832405的博客 406

C语言菜鸟入门·数据结构·链表超详细解析

对比于顺序表的每个节点只存放数据元素,单链表的每个节点除了存放数据元素外,还要存储指向下一个节点的指针。优点:可随机存储,存储密度较高;缺点:要求大片连续空间,改变容量不方便。优点:不要求大片连续空间,改变容量方便;缺点:不可随机存取,要耗费一定空间存放指针。对于单链表的每一个结点,都需要有一个数据域用于存放节点的数据元素,需要一个指针域用于指向下一个结点。而若是我们想要增加一个新的结点,我们可以使用malloc关键字,例如:首先,我们先声明一个指向。

时光の尘的博客 6246

基于LightGBM和多模型融合的量化交易研究:沪深300为例【附代码】

📊 数据科学与大数据专业 | 数据分析与模型构建 | 数据驱动决策✨ 专业领域:数据挖掘与清洗大数据处理与存储技术机器学习与深度学习模型数据可视化与报告生成分布式计算与云计算数据安全与隐私保护💡 擅长工具:Python/R/Matlab 数据分析与建模Hadoop/Spark 大数据处理平台SQL数据库管理与优化Tableau/Power BI 数据可视化工具TensorFlow/PyTorch 深度学习框架✅数据科学与大数据技术毕业论文【数据】

lagougongzuoshi的博客 1671

[LeetCode]2. 两数相加

2. 两数相加 难度:中等 给你两个 非空 的链表,表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的,并且每个节点只能存储 一位 数字。 请你将两个数相加,并以相同形式返回一个表示和的链表。 你可以假设除了数字 0 之外,这两个数都不会以 0 开头。 示例 1: 输入:l1 = [2,4,3], l2 = [5,6,4] 输出:[7,0,8] 解释:342 + 465 = 807. 示例 2: 输入:l1 = [0], l2 = [0] 输出:[0] 示例 3: 输入:l1 = [9,9,

张小猪的家 1034

数据分析(二):学生成绩预测分析报告

表1 特征变量描述变量描述school学生的学校sex学生的性别age学生的年龄address学生的家庭住址类型famsize家庭规模Pstatus父母同居状况Medu母亲的教育Fedu父亲的教育Mjob母亲的工作Fjob父亲的工作reason选择学校的理由guardian学生监护人traveltime从家到学校的时间studytime每周学习时间failures过去的类失败次数schoolsup额外的教育支持famsup家庭教育支持。

m0_73963149的博客 4417

【DaVinci Developer工具实战】03 -导入xml文件

本文档描述了 DaVinci Developer 导入数据的的具体功能 ,它适用于导入AUTOSAR SWC 模板【AUTOSAR XML 文件】 文件。

1992

菜鸟学习历程【12】链表

链表本文仅对单向链表进行讲解,其余链表类型不做过多讲解。一、定义:链表是线性表的链接存储表示二、分类:单向链表、静态链表、双向链表、循环链表三、特点:每个元素由数据域和指针域构成    1.结点可以连续,也可以不连续存储;    2.结点的逻辑顺序与物理顺序可以不一致;    3.表的容量可以不断变大(顺序表是固定的)。四、插入结点head为头结点,a为待插入的结点,假设a的地址为0x100;对于...

leessang_bo的博客 1484

基于YOLO26深度学习框架的文档表格识别系统的算法研究实现方法

本文研究了基于YOLO26深度学习框架的文档表格识别系统实现方法。系统采用YOLO26网络架构,通过数据预处理、模型训练、检测推理和表格分析四个模块实现高效表格识别。研究详细阐述了数据归一化、增强等技术处理,以及采用迁移学习策略优化模型训练过程。实验表明,该系统能有效识别多种表格结构并生成结构化数据,为文档自动化处理提供了可靠解决方案。

一键难忘的博客 976

菜鸟[1]_链表(C语言)

链表 链表(linked list)是一种很有用的数据存储方式。是线性的。依照我的理解就是很多个点连接起来,其中每个点包括两部分一部分是数据,一部分是指针(指向下一个节点的指针)。如下图: 在上图中每一个方框所代表的就是一个节点。每个节点中的指针都指向下一个节点的地址。 以上就是链表的概念,那么在C语言中如何创建一个链表呢? 首先我认为在学习链表之前要学会创建指向结构的指针这个操作,下面我们就说一下怎么创建指向结构的指针,并且如何对其中的元素进行操作。 #include<stdio.h> #i

L_Mu2000的博客 2481

科研问答:医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

医药类本科生(临床、中医、中药与护理)本科阶段是否需要开展科研学习?

MD Code 1512

如何使用Google Maps API爬取地理数据:详细教程与Python实现

Google Maps API 是一组服务的集合,允许开发者访问地图、地点、路线等地理信息。:将地址转换为地理坐标,或将地理坐标转换为地址。:计算两点之间的行车路线、步行路线等。Places API:获取附近的地点、商店、餐馆等。:计算多个地点之间的距离和时间。在接下来的代码中,我们将结合这些 API,展示如何获取并处理地理数据。本文详细介绍了如何使用 Google Maps API 获取地理数据,涵盖了从地址转经纬度、获取地点详情、计算路线、计算多个地点的距离与时间等多个功能。

2201_76125261的博客 733

力扣刷题-单链表两数相加

每日一道力扣刷题总结:单链表-两数之和,难易程度:中等。

Hi_shallyi的博客 2972

079、LVGL基础控件:消息框(Msgbox)

《LVGL消息框控件深度解析与避坑指南》 文章深入剖析了LVGL消息框控件的核心特性和使用技巧。消息框本质是带按钮的模态容器,而非独立窗口。作者分享了创建消息框的正确姿势、标题/内容设置方法、安全的按钮事件处理方式(避免直接调用close函数导致栈溢出),并详细介绍了模态/非模态实现、样式自定义、动态更新等实用技巧。针对常见问题如内存管理、按钮数量限制、动画效果等给出了专业建议,特别强调了消息框作为用户交互关键环节的优化重要性,建议通过异步删除、合理父对象选择等方式提升稳定性。文章包含大量实际项目经验总结,

m0_50546716的博客 153

【数据结构与算法】最适合新手小白的教程——链表初步(包你看懂!)

链表是一种基础的数据结构,由一系列节点(Node)组成,每个节点包含两个部分:一个数据域(存储实际的数据)和一个或多个指针域(存储指向其他节点的引用)。链表通过这些指针将节点连接成一个线性序列。根据指针的数量和连接方向,链表可以分为以下几种类型:1. 单链表(Singly Linked List)结构:每个节点只包含一个指向下一个节点的指针。特点:单向链接,只能从头节点开始顺序访问到最后一个节点,不能反向访问。应用场景:常用于实现简单的数据集合,提供动态插入和删除操作。

yktssg的博客 818

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

数据结构与算法学习之路:简单的电话簿实现——单向链表

作为正在学数据结构的小菜鸟,想在这分享一些数据结构学习的历程…… 代码都是

追风筝的吃货,汪~ 2599

IMSL CNL 7.0.0 (x86-64)Crack

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

数据结构与算法简介

数据结构与算法核心摘要 数据结构与算法是计算机科学的基础,涉及数据组织与问题解决方法。 关键内容: 数据结构:包括数组(随机访问)、链表(动态插入)、栈/队列(LIFO/FIFO)、树(层次关系)、图(网络关系)和哈希表(快速查找) 算法:涵盖排序(快速/归并)、搜索(二分)、遍历(DFS/BFS)及动态规划等优化技术 应用价值:提升代码效率(如哈希表查找O(1))、增强逻辑思维,是技术面试核心考点 学习建议:结合理论(如《算法导论》)与实践(LeetCode),重点掌握时间复杂度分析。推荐资源包括图解教程

likuoelie的博客 882

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

1.菜鸟级基础算法:链表遍历

关于链表遍历的思路 #include #include #define ERROR 0 #define OK 1 #define ElemType int   typedef struct LNode {  int data;  struct LNode *next; }LNode,*LinkList;   int CreateLink_L(LinkList &L,int

LEO_samyze的专栏 767

一文读懂 Java 数据结构与算法:从菜鸟到大神的蜕变

数据结构和算法是 Java 编程的核心,它们就像你的左膀右臂,帮你在代码世界里披荆斩棘。掌握了不同的数据结构和算法,你就能根据实际情况,选择最合适的工具来解决问题,让你的代码跑得又快又稳。好啦,今天关于 Java 数据结构和算法的分享就到这里啦!希望大家都能在代码的海洋里畅游,用数据结构和算法这两把利剑,斩破所有难题!有问题也欢迎在评论区留言,咱们一起讨论!

java_beautiful的博客 776

【数据结构与算法】程序的内修

前言 数据结构与算法是我们在学习任何一种程序语言后,都要修习的一门学科,掌握数据结构与算法才能使你写出的程序语言具备灵魂,因此它是程序的内功。 程序的内修一、数据结构与算法的重要性二、关于修习这门功课的看法三、学习链接 一、数据结构与算法的重要性 1、它的重要性除了上述的之外,还与你的面试有关,现在一些大厂例如:腾讯、阿里、百度、字节等等,面试都会有【算法题】,掌握数据结构与算法也是进入这些大厂的关键。 2、我本人是学习嵌入式的,当时开始学单片机裸机开发的时候,并没有遇到数据结构与算法的问题,随着

修成真的博客 9103

算法与数据结构——六大排序

有颜色的是有序区,无颜色的是无序区,每一趟排序后都会多一个有序区,少一个无序区。每一趟排序都是排的无序区。指针指到谁,谁就和自身后面的元素比较,比它大就交换。中return的意思的是返回数值的意思,它可以选择性的返回一个值给调用的方法,语法格式“return[表达式]”,当指针指向8时,8和1进行交换;8在此时已经变为有序区了!随便定一个数为有序区,所以只需要摸n-1张牌来插入到这个有序区中,左边有空位就从右边的指针从右往左开始找比5小的数!插8时,把有序区的9往后挪,将8插入!堆是一个特殊的完全二叉树。

csdn2486的博客 1867

嵌入式菜鸟算法③---链表操作

主要内容:链表头插法和尾差法 #include //typedef int data; typedef struct node { char data; struct node* next; }linklist; /* method 1 insert node as first element */ linklist* CreateList1() { char ch; linkl

Evolution 1090

菜鸟日记day2-力扣第二题

我学习的时候也陷入这种困难之中,这时我们只需要定义一个头head(head只是我命名的,你也可以head1,乱七八杂都行,只要是个变量名就行了)来指定,这样咱们就得到了一个单向链表,这种结构很简单。之后再看题目的要求,就是对应位置相加嘛,这种题目我可是有心得的,先定义一个flag,用来表示进位与否,因为它说数据部分只能是一个数字,所以flag不是0就是1,所以在两个节点相加之前,检查一下flag就行了,如果flag为1,加的时候加上1,没有就不加,加完之后要判断是否要进位(也就是大于10吗?

m0_53406403的博客 533

数据结构-链表的基本操作

通过题目来巩固基础

fengbizhe的博客 904

【源码系列】Java中的数据结构——栈,队列,链表与LinkedList

自从上次字节面试凉了之后,我就一直有这个想法,想写个源码系列的博客。无奈最近事情太多,无法真正静下心来写。原本是想暑假来好好写这个系列,但因为下周要由我来负责协会授课,所以只能在这周写完。也好,毕竟只有ddl才有效率嘛(笑哭)。

风过孤屿,山海自成诗行。 2715

数据结构与算法基础知识

目录 0.总 1.基本概念 2.抽象数据类型 3.算法评价指标 4.链表 5.树 5.堆 6.二叉排序树与堆的区别 7.图 8.排序 9.查找 10.索引和搜索 11.其他数据结构 11.其它算法 0.总 C++: 数据结构基础学习笔记目录 - 专注于linux,网络 - 优快云博客 https://blog.youkuaiyun.com/qq_35733751/arti...

789请问的博客 1250

数据结构+算法(第09篇):菜鸟也能“种”好二叉树!

作者简介:大家好,我是哥,前中兴通讯、美团架构师,现某互联网公司联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬学习必须往深处挖,挖的越深,基础越扎实!

smart_an的专栏 1257
上一篇: 刷野打怪上王者·C++篇·第15期·重载操作
下一篇: 菜鸟玩算法·数据结构与算法·第3期·堆栈与队列
元宇宙MetaAI
博客等级 码龄10年 331粉丝 333原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值