c++ 链表操作:添加、遍历、删除、查找

C++ STL list的初始化、添加、遍历、插入、删除、查找、排序、释放 list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。 使用list容器之前必须加上STL的list容器的头文件:#include; list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命名空间方式:using nam 阅读详情

       链表是一种动态数据结构,因为在创建链表的时候,无需知道链表的长度。链表的每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。

struct node
{
	int value;
	node* next;
};

当插入一个结点的时候,我们只需要为新结点分配内存,然后调节结点的指针指向,新结点就被(逻辑上)链接到链表里。

/* 链表尾加入新元素*/
node* addNode(node*head ,int addValue)
{
	 node* newNode=new node();
	 newNode->next=NULL;
	 newNode->value=addValue;
	 node* p=new node();
	 p=head; //list的头结点
	 if(head==NULL)
	 {
	   head=newNode; //新节点为链表头节点
	 }else
	 {
		while(p->next!=NULL)//找到尾节点
			p=p->next;
		p->next=newNode; //在尾节点后面加入新节点
	 }
	 return head;
}



由于链表中的内存不是一次性连续分配的,因此我们无法保证链表的内存和数组一样是连续的。因此想在链表中找到它的某一个结点,我们只能从头结点开始,沿着指向下一个结点的指针遍历链表,它的时间效率为O(n)。

/*在链表中找到某个值,删除它*/
node* removeNode(node* head,int value)
{
	node* pNode=head;
	node* deleteNode=NULL;
	if(head==NULL)
	{
	   cout<<"链表为空"<<endl;
	   return NULL;
	}else if(head->value==value)//头节点为目标节点
	{
		deleteNode=head;
		head=head->next;
	}else
	{
	   while(pNode->next!=NULL&&pNode->next->value!=value)//找出目标节点的上一个节点
		 pNode=pNode->next;
	   if(pNode->next!=NULL&&pNode->next->value==value)
	   {
	   deleteNode=pNode->next;
	   pNode->next=pNode->next->next;//删除目标节点
	   }
	}
	 if(deleteNode!=NULL)
	   {
		   delete deleteNode;
		   deleteNode=NULL;
	   }
	return head;
}

从头到尾遍历链表

/*从头到尾遍历链表*/
void travelList(node*head)
{
	node* pNode=head;
	if(head==NULL)
		return ;
	else
	{
	  cout<<pNode->value<<'\t';
	  while(pNode->next!=NULL)
	  {
		  pNode=pNode->next; 
          cout<<pNode->value<<'\t';
	  }
	}  
}

 

从尾到头打印每个结点,我们从头到尾遍历链表,并把每个节点放在stack结构中,利用stack结构先进后出”的特点,从尾到头打印结点。时间复杂度为O(n).

/*从尾到头遍历链表*/
void printNodeReserve(node* head)
{
	stack<node*> nodeStack;
	node * pNode=head;
	if(head==NULL)return ;
	//遍历链表,并把节点保留在stack里
	while(pNode!=NULL)
	{
		nodeStack.push(pNode);
		pNode=pNode->next;
	}
	while(!nodeStack.empty())
	{	
       pNode=nodeStack.top(); //返回top节点
	   cout<<pNode->value<<endl;
	   nodeStack.pop();//删除top节点
	}
}


输出链表中倒数第K个结点。

为了实现一次遍历链表就能找到倒数第K个节点,我们定义两个指针p1,p2。第一个指针p1从链表头指针开始往前走k步,此时,第二个指针p2不动。从第k+1步开始,指针p2也开始头链表头开始遍历,两个指针距离是k.当p1遍历完链表,指向一个null值的时候,p2指针正好是倒数第k个结点。

比如查找倒数第2个指针


//查找链表中倒数第k个节点,并输出
void printKthTOTotal(node *head, int k)
{
	//如果链表为空,或k为0,return 
	if(head==NULL||k<=0) return;
	node* pNode1=head;
	node* pNode2=head;
	//p1指针先往前走k步
	while(k>0&&pNode1!=NULL)
	{
		pNode1=pNode1->next;
		k--;
	}
	//当链表长度小于k,return
	if(k>0)return;
 	while(pNode1!=NULL)
	{
		pNode1=pNode1->next;
		pNode2=pNode2->next;
	}
	cout<<pNode2->value<<endl;
}



/



        
用C++编写单链表类模板,实现链表的创建,遍历,链表结点的插入,删除,查找,并建立一个整数链表和一个字符串链表 编写单链表类模板,实现链表的创建,遍历,链表结点的插入,删除,查找,并建立一个整数链表和一个字符串链表。 IntList.h #include<iostream> using namespace std; template<typename T> class intList { protected: struct Node { struct Node* next; T data; }; Node* pFirst; public: intList(); //构造 阅读详情

相关推荐

动态链表学习笔记:查找,插入与删除

有了插入的铺垫,删除的原理与之相似,也是输入要删除的数据(p2)的位置,那么我们只需要用查找函数找到该位置结构体的前一位(p1)和后一位(p3),让前一个结构体的地址部分指向它后一个结构体。我们查找的逻辑是:输入了元素的位置后,先判断输入是否合理(这个变量起码要大于0)我们只需要在函数中添加一个循环控制变量,当变量和我们输入的元素位置的变量相等时返回对应的指针。输入要插入数据的位置,输入要插入的数据,将数据插入到输入的位置数据的后面。输入要删除的元素的位置,将该处的数据从链表中删除。

weixin_45080800的博客 1194

C++ 遍历 链表

一种使用int*指针来访问链表元素的方法 (并非使用next指针的方法) 编译环境:TDM-GCC 4.9.2 32-Bit Release 众所周知 c与cpp中的链表可以通过结构体或class创建。比如: class ListNode{ private: int val; public: ListNode* next; int get(){return val;} ListNode(int v):val(v),next(N...

weixin_44795128的博客 6779

利用C++创建带头结点单链表,并实现插入、删除、遍历、清空、退出等功能

利用C++创建带头结点单链表,并实现插入、删除、遍历、清空、退出等功能

qq_44757691的博客 2986

C++ 链表遍历

C++ 链表遍历

weixin_46585382的博客 2664

从FP16到FP8:我是如何让Stable Diffusion 3.5提速40%而不丢画质的

本文分享了StableDiffusion模型优化的实战经验。通过FP8精度转换、分层处理敏感模块,实现显存占用降低35%、推理速度提升40%。文章详细介绍了提升画质的五大技巧、本地/云端/移动端部署方案,以及二次元模型定制等垂直领域应用。同时总结了硬件兼容性、数据质量等七大常见陷阱,并强调持续监控和伦理考量。作者指出未来应关注MoE架构、注意力机制优化等方向,认为技术优化是持续追求性能与质量平衡的过程。

达则兼济天下 1187

Ubuntu20.04实时内核补丁PREEMPT_RT编译与安装全流程解析

本文详细解析了在Ubuntu20.04系统上编译与安装实时内核补丁PREEMPT_RT的全流程。从内核与补丁版本匹配、编译环境准备,到内核配置、编译排错,再到最终安装、验证与进阶优化,提供了手把手的实战指南,旨在帮助机器人、工业控制等对实时性有苛刻要求的开发者构建低延迟、高确定性的Linux系统。

weixin_29213827的博客 186

C++ 链表

C++链表笔记

m0_62175410的博客 4万+

unity游戏开发日志(一)将mmd模型导入unity,并解决材质丢失的问题

unity音乐游戏开发,导入角色模型并解决材质问题

yizhigou1的博客 1762

C语言数据结构——单链表

单链表的建立、增、删、改、查

Epsilon_Win的博客 2555

C#实战:基于ONNX与SCRFD/ArcFace的高效人脸识别系统开发

本文详细介绍了如何在C#环境中,利用ONNX Runtime高效部署SCRFD人脸检测与ArcFace人脸识别模型,构建一个完整的、高性能的人脸识别系统。内容涵盖环境搭建、模型推理、人脸对齐、特征提取等核心模块,并提供了从Demo到生产系统的优化思路与实战代码,为.NET开发者提供了一套开箱即用的解决方案。

weixin_29061821的博客 488

用Python玩转LQR控制:3行核心代码实现倒立摆稳定控制(附Jupyter Notebook)

本文通过Python实战演示了如何使用LQR算法实现倒立摆的稳定控制。文章以直观方式解释LQR原理,提供从系统建模、核心代码求解到参数调优的完整流程,并附有可运行的Jupyter Notebook代码。重点介绍了如何利用SciPy库快速计算最优反馈增益,并通过仿真验证控制效果,为运动控制实践提供了即学即用的指南。

weixin_29311017的博客 83

【数据结构与算法】- 循环链表 - 详细实现步骤及代码(C/C++)

本文介绍循环链表的基础概念,以及一步步说明怎样实现一个循环链表,最后给出C语言实现代码

wkd_007的博客 1万+

保姆级教程:用Kvaser DB Editor从零创建你的第一个DBC文件(附CAN信号属性详解)

本文提供了一份详细的Kvaser DB Editor教程,指导用户从零开始创建DBC文件,并深入解析CAN信号属性的关键设置。通过步骤清晰的安装指南、信号属性配置详解和实用技巧,帮助工程师和学生快速掌握CAN总线通信的核心工具,提升工作效率。

weixin_27076351的博客 250

c++ 链表操作:添加、遍历、删除、查找

链表是一种动态数据结构,因为在创建链表的时候,无需知道链表的长度。链表的每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。 struct node { int value; node* next; }; 当插入一个结点的时候,我们只需要为新结点分配内存,然后调节结点的指针指向,新结点就被(逻辑上)链接到链表里。 /* 链表尾加入...

m0_37884601的博客 5994

SAP CPI 之使用国密算法实现SM系列算法加解密

System.out.println("SM2-私钥:" + privateKey);System.out.println("SM2-公钥:" + publicKey);System.out.println("SM2-密文:" + encrypts);System.out.println("SM2-明文:" + data2);新建groovy,通过import之后,调用jar包中的方法。在CP中导入jar包,选择Upload,选中导入的jar包。的密钥和向量值,不安全!的公钥和私钥,不安全!

u012830826的博客 1335

Statistics and Machine Learning Toolbox

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

《面试准备》C++链表操作1(包含链表的创建、插入删除、遍历、反转、判断是否有环、环的长度)

直接上代码: #include <iostream> #include <stack> using namespace std; #define noloop //choose loop or noloop //单向链表节点 struct ListNode{ int value; struct ListNode *Next; }; class MyL...

hunzhangzui9837的博客 486

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C语言数据结构 单链表的建立、遍历、查找、插入和删除操作

链表(Linked List)是一种物理存储单元上非连续、非顺序的数据结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 链表由一系列结点(node,链表中每一个元素称为结点)组成,每一次为一个结构体 动态分配的内存空间,可称之为一个结点,每个结点之间可以是不连续的,但结点内是连续的。结点个数是不受限定的,可以随时删改,这是与数组相比的优点。.........

追求。 1万+

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C++单链表的动态创建,查找,遍历,删除,插入,添加,排序

//单链表的动态创建,查找,遍历,删除,插入,添加,排序#includetypedef struct node //定义一个结构体,在c++中也是一个类{ int val; struct node* pNext;}NODE,*PNODE;//NODE == struct node 定义一个新的接点//PNODE == struct node* 定义一个

gengxiaoying的专栏 1万+

C\C++之用结构体实现链表的创建、遍历、结点插入、结点删除

C\C++之用结构体实现链表的创建、遍历、结点插入、结点删除 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!

小啊呜的博客 4282

02.C语言单链表的创建、遍历、查找、清空、删除、修改、退出

//输入输出头函数 #include<iostream> using namespace std; #define OK 1; #define ERROR 0; #define OVERFLOW -2; typedef int Elemtype; /** * 单链表的存储结构 */ typedef struct LNode{ Elemtype data; struct LNode *next; }LNode,*LinkList; /** * 尾插法创建单链表 *

chongyang_的博客 3173

C++手写链表、反转链表、删除链表节点、遍历、为链表增加迭代器

本篇博客介绍如何使用C++实现链表,首先编写一个简单的链表,然后增加模板,再增加迭代器。

琅嬛福地 1914

c++ 单循环链表的创建、添加、删除

// 单向循环链表 typedef struct _CircleLinkList{ int val; struct _CircleLinkList* next; }CircleLinkList; // 初始单向循环链表化链表——头插法 CircleLinkList* Create_LinkList_Head() { CircleLinkList* head, * node; int x...

jyzeng1989的博客 3615

[转]C++ STL list的初始化、添加、遍历、插入、删除、查找、排序、释放

list是C++标准模版库(STL,Standard Template Library)中的部分内容。实际上,list容器就是一个双向链表,可以高效地进行插入删除元素。 使用list容器之前必须加上STL的list容器的头文件:#include<list>; list属于std命名域的内容,因此需要通过命名限定:using std::list;也可以直接使用全局的命...

anjie1937的博客 581

数据结构——链表单向链表的创建插入删除遍历操作(C++实现)

链表较数组优缺点 链表 优点: 插入删除元素效率高。 Note:插入和删除一个元素,只需要修改该位置上前后节点的指针即可。 不需要一个连续的很大的内存。 Note:链表内存为随机分配,基本不存在链表满的情况 缺点: 查找某个未知的元素效率低。 Note:需要从头结点或者尾结点(双向链表)开始,对每个节点进行遍历,直到找到该元素。 数组 优点: 存取速度快 缺点: 需要一个很连续的很大的内存。...

少年 1544

在c/c++中,如何使用链表进行插入、删除和遍历功能。

处理头节点删除和中间节点删除两种情况。依次插入3个节点(1→2→3):释放链表内存,避免内存泄漏。:存储节点值(此处为整型)使用二级指针修改头节点指针。:指向下一个节点的指针。:在链表头部插入新节点。分步删除节点并打印结果。时间复杂度:O(1)时间复杂度:O(n)

ALL IS FILE_ 917
上一篇: C++ 虚函数
下一篇: 求链表的中间结点
yes1cpp
博客等级 码龄14年 15粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值