双向链表

C++实现单向链表,双向链表,单向环形链表,双向环形链表 本文讲解了链表的四种类型以及数据结构,同时给出了四种链表的C++代码实现。 阅读详情
#include<iostream>
using namespace std;
#include <assert.h>


typedef int DataType;


class LinkNode
{
	friend class List;
public:
	LinkNode(const DataType& x)
		:_data(x)
		, _prev(NULL)
		, _next(NULL)
	{}
private:
	DataType _data;
	LinkNode* _prev;
	LinkNode* _next;
};


class List
{
public:
	List()
		: _head(NULL)
		, _tail(NULL)
	{}
public:
	void PushBack(const DataType& x)
	{
		//空
		//一个或一个以上节点
		if (_head == NULL)
		{
			_head = new LinkNode(x);
			_tail = _head;
		}
		else
		{
			LinkNode* end = new LinkNode(x);
			_tail->_next = end;
			end->_prev = _tail;
			_tail = end;
		}
	}


	void Print()
	{
		if (_head == NULL)
		{
			return;
		}
		else
		{
			LinkNode* begin = _head;
			while (begin)
			{
				cout << begin->_data << " ";
				begin = begin->_next;
			}
			cout << endl;
		}
	}


	void PopBack()
	{
		//空
		//一个
		//多个
		if (_head == NULL)
		{
			return;
		}
		else if (_head == _tail)
		{
			delete _head;
			_head = NULL;
			_tail = NULL;
		}
		else
		{
			LinkNode* del = _tail;
			_tail = _tail->_prev;
			delete del;
			_tail->_next = NULL;
		}
	}


	void PushFront(const DataType& x)
	{
		//空
		//一个或多个节点
		if (_head == NULL)
		{
			_head = new LinkNode(x);
			_tail = _head;
		}
		else
		{
			LinkNode* begin = new LinkNode(x);
			begin->_next = _head;
			_head->_prev = begin;
			_head = begin;
		}
	}


	void PopFront()
	{
		//空
		//一个
		//多个节点
		if (_head == NULL)
		{
			return;
		}
		else if (_head == _tail)
		{
			delete _head;
			_head = NULL;
			_tail = NULL;
		}
		else
		{
			LinkNode* del = _head;
			_head = _head->_next;
			delete del;
			_head->_prev = NULL;
		}
	}


	LinkNode* Find(const DataType& x)
	{
		LinkNode* begin = _head;
		while (begin)
		{
			if (begin->_data == x)
			{
				return begin;
			}
			begin = begin->_next;
		}
		return NULL;
	}


	void Insert(LinkNode* pos, const DataType &x)
	{
		assert(pos);
		if (pos == _tail)
		{
			PushBack(x);
		}
		else{
			LinkNode* tmp = new LinkNode(x);
			tmp->_next = pos->_next;
			pos->_next->_prev = tmp;
			pos->_next = tmp;
			tmp->_prev = pos;
		}


	}


	void Erase(LinkNode* del)
	{
		assert(del);
		if (del == _head)
		{
			_head = _head->_next;
			delete del;
			_head->_prev = NULL;
		}
		else if (del == _tail)
		{
			PopBack();
			//有问题
			//_tail = _tail->_prev;
			//delete del;
			//_tail->_next == NULL;
		}
		else
		{
			del->_prev->_next = del->_next;
			del->_next->_prev = del->_prev;
			delete del;
		}
	}


	void Reverse()
	{
		LinkNode* begin = _head;
		LinkNode* end = _tail;
		while (begin != end && begin->_prev != end)
		{
			swap(begin->_data, end->_data);
			begin = begin->_next;
			end = end->_prev;
		}
	}


private:
	LinkNode* _head;
	LinkNode* _tail;
};


void Test1()
{
	List l1;
	//l1.PushBack(5);
	//l1.PushBack(5);
	//l1.PushBack(5);
	//l1.PushBack(5);
	//l1.PushBack(5);
	l1.PushFront(2);
	l1.PushFront(3);
	l1.PushFront(7);
	l1.PushFront(5);
	l1.PushBack(8);
	l1.Print();
	l1.Reverse();
	//LinkNode* ret = l1.Find(2);
	//l1.Erase(ret);
	//l1.Insert(ret, 11);
	//l1.PopFront();
	//l1.PopFront();
	//l1.PopFront();


	//l1.PopFront();
	l1.Print();
	//l1.PopBack();
	//l1.PopBack();
	//l1.PopBack();
	//l1.Print();
}


int main()
{
	Test1();
	system("pause");
	return 0;
}

双向链表详解 注意:这⾥的“带头”跟前⾯我们说的“头结点”是两个概念,实际前⾯的在单链表阶段称呼不严 谨,但是为了同学们更好的理解就直接称为单链表的头结点。在单链表中我们会去说头节点,并不是意思是说,单链表是带头链表,而是指的是单链表的第一个节点,方便理解而已。双向链表和单链表的区别在于:双向链表有哨兵位,也就是带头,我们在扩容的时候需要传一个无效的数据去占位。单链表是单向的所以只有指向下一节点的指针,而双向链表是双向的所以还要包括指向前一节点的指针。:数据+指向下一节点的指针+指向前一个节点的指针。 阅读详情

相关推荐

Agent 操作系统:未来的 Harness 平台

在大模型技术爆发的当下,自主智能体(Agent)已经成为AI原生应用的核心载体,但当前Agent开发面临着碎片化严重、运维难度高、规模化落地难三大核心痛点,就像1970年代没有通用操作系统的裸机编程时代,开发者需要重复造轮子解决底层基础设施问题。本文将深度解析Agent操作系统(Agent OS)作为AI原生时代的底层基础设施的核心定位,以及下一代Harness平台如何将Agent OS与成熟的DevOps、CI/CD、可观测性、成本管理能力深度融合,成为AI原生应用全生命周期管理的统一平台。

软件工程实践的博客 280

什么是双向链表,一篇搞懂双向链表

双向链表,python3

hahaha_1112的博客 1971

FLUX.1 LoRa 微调

微调的好处:可以让你突破换脸这种输入图片的场景约束,微调好的模型可以让你真正的文生图。换脸只能根据输入的图片和视频来生成内容。

szmars的博客 3621

双向链表的实现

本文主要介绍了双向链表的结构,概念,相关接口的具体实现方法和链表与顺序表的区别, 并简要介绍了哨兵位的含义与作用。

2303_81060385的博客 1243

Matlab+Matpower实战:手把手教你生成IEEE14节点FDIA攻击数据集(附完整代码)

本文提供了一份基于Matlab与Matpower工具构建IEEE14节点FDIA攻击数据集的完整实战指南。通过动态负荷数据模拟、潮流计算、状态估计及隐蔽攻击向量注入,手把手教你生成可用于电力系统网络安全研究的仿真数据集,并附有核心代码与调试技巧。

bean的博客 399

医学图像处理入门:如何用Python将CT灰度图转换为伪彩色图像(附代码)

本文详细介绍了如何使用Python将CT灰度图转换为伪彩色图像,提升医学图像的可读性和诊断效率。通过OpenCV和Matplotlib等工具,实现灰度值到彩色空间的映射,特别适用于突出显示特定组织密度差异。文章包含完整代码示例和临床实用技巧,适合医学影像分析初学者和Python开发者。

gitlab7runner的博客 326

【数据结构】之双向链表、双端(双向)链表、循环(双向)链表

双向链表、双端(双向)链表、循环(双向)链表示意(简)图: 声明:下面各图中,箭头指向的是整个节点,而不是指向节点中的prior或next。 双向链表:只有一个指针指向最开始的结点。 双端(双向)链表:有两个指针分别指向两端的节点。 循环(双向)链表:指向形成一个闭环。 双端(双向)链表的Java实现(简单示例): 注:双向链表、双端(双向)链表、循环(双向)链表的实现思路...

JustryDeng 2211

PCL基础:getTransformation函数全流程解析与应用实例,一篇文章精通点云变换

在 Eigen 和 PCL 中,getTransformation是一个常用的函数,用于根据输入的平移和旋转信息(如欧拉角或四元数)生成一个仿射变换矩阵(Eigen::Affine3f或 Eigen::Affine3d)。1)在 Eigen 中,可以通过四元数和平移向量构造一个变换矩阵。2)讲解了从四元数转换到欧拉角,或者从欧拉角转换到四元数的方法。

weixin_42896234的博客 1368

数据结构——双向链表(双向连接的图解、双向链表的创建、操作双向链表)

举个例子: 假设一个文本编辑用链表来存储文本. 每一行用一个String对象存储在链表的一个节点中. 当编辑器用户向下移动光标时, 链表直接操作到下一个节点即可. 但是当用于将光标向上移动呢?- 我们可以轻松的到达下一个节点, 但是回到前一个节点是很难的. 但是, 在实际开发中, 经常会遇到需要回到上一个节点的情况。- 也就是链表相连的过程是单向的. 实现的原理是上一个链表中有一个指向下一个的引用.- 一个节点既有向前连接的引用, 也有一个向后连接的引用.- 既可以从头遍历到尾, 又可以从尾遍历到头。

qq_52301431的博客 4576

【异常】DeepSeek API HTTP 401 认证失败错误完整排查与解决方案

摘要:本文针对DeepSeek API开发中的HTTP 401认证失败错误进行深度解析,指出该错误属于不可重试的认证类问题。文章首先拆解错误日志关键字段,区分401与其他API错误的本质差异。随后提供优先级排序的全链路解决方案:1)检查API密钥有效性;2)规范请求头认证格式;3)排查账户权限状态;4)验证请求环境配置。最后建议通过新建测试密钥、使用官方示例代码或联系技术支持进行兜底处理。全文采用技术脱敏处理,为开发者提供系统性的401错误排查指南。(149字)

奶爸的编程之路,也就一周冷个三天 1531

Node-RED系列(二二):使用dashboard搭配echarts制作漂亮的面板

在node-red中dashboard 是一个很常用的模块,其中它有一个chart节点可以用来制作一些图表,比如柱状图,折线图,饼图,但其中的图表并不是很美观,而且可配置项非常的少。 于是就有很多小伙伴找我做一套比较好看的图表面板,在对比了一下几个图表库,我选中了echarts。 不仅美观大方,而且非常容易集成,配置。下面先来看一下我做的效果。这里是直接做了四个折线图,第一个折线图有动态效果,第二个折线图是一个多线条的折线图,第三个折线图是在一个图例显示两个折线图。第二第三都可以用于数据对比。 第四个折线

知无涯 1万+

【双向链表】数据结构双向链表的实现

双向链表的实现

m0_56069910的博客 2196

⚡【C++要笑着学】(13) STL介绍:什么是STL标准模板库 | STL的版本 | 浅谈STL的缺陷

再讲解函数模板之前先对STL做一个小铺垫,本篇将对STL做一个简单的介绍。

有道无术, 术尚可求。有术无道, 止于术。 3036

数组实现双向链表、双向链表的操作

分析: 思路: 遍历:和单链表一样,只是可以向前,也可以向后查找。 添加(默认添加到双向链表的最后) (1).先找到双向链表的最后这个节点(temp) (2).temp.next = newHeroNode (3).newHeroNode.pre = temp; 修改思路和单链表一样 删除 (1).以为是双向链表,因此,我们可以实现自我删除某个节点 (2).直接找到要删除的这个节点,比...

qq_40823802的博客 2011

jre9下载 jdk9

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

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

双向链表和双向循环链表

1.创建一个新结点2.遍历链表找到最后一个结点p3.p结点的后继指针指向新结点,新结点的前驱指针指向p,新结点的后继指针指向NULL;void Insert_tail(DLIST head, DLIST node)\\尾部插入= NULL)void Show(DLIST head)\\打印链表while (p!= NULL)int main()\\运行Show(head);return 0;

weixin_63082397的博客 1015

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

第2章 双向链表

对链表而言,双向均可遍历是最方便的,另外首尾相连循环遍历也可大大增加链表操作的便捷性。因 此,双向循环链表,是在实际运用中是最常见的链表形态。

m0_74916669的博客 946

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

特殊的链表——双向链表

一、双向链表的概述 1、双向链表的定义:在单链表的每个结点里再增加一个指向其直接前驱的指针域prior,这样链表中就形成了有两个方向不同的链,故称为双向链表。 2、优点:双向链表可以克服单链表查找链表中某结点不方便的缺点。 3、双向循环链表:和单链的循环表类似,双向链表也可以有循环表。让头结点的前驱指针指向链表的最后一个结点,让最后一个结点的后继指针指向头结点。 二、双向链表的特点与算法操作 1、双向链表结构的对称性:设指针P指向某一结点,侧有: p->next->prior=p=p

kxbdys的博客 4420

双向链表的双向遍历

双向链表的双向遍历 双向链表相比较于单向链表的优势之一就是可以快速遍历,对于单向链表只能借助于单个指针逐个遍历,而对于双向链表而言因为每个节点都存在一个前指针和后指针,所以可以借助于两个指针双向遍历,相对于单向链表而言可以节省很多时间。但是对于双向链表的双向遍历需要考虑的因素偏多,代码的步骤需要非常严谨。对于两个指针而言需要考虑节点数是奇数还是偶数,若是奇数,要考虑两指针相遇的情况,只需要输出其中...

A___jay的博客 3903

双向链表、双向循环链表

当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。这些子列表可以有一个或多个自己的子列表,以此类推,以生成如下面的示例所示的。对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。为了将每一级都序列化到一起,我们需要每一级中添加值为 null 的元素,以表示没有节点连接到上一级的上级节点。你会得到一个双链表,其中包含的节点有一个下一个指针、一个前一个指针和一个额外的。是一个带有子列表的节点。

nameofcsdn的博客 868

【C++】双向链表

前言: 前面我们实现了 单向链表 ,也发现了它的一些局限性。 比如说: ∙\bullet∙ 查找方向只能是单向的,每次只能从头查到尾 ∙\bullet∙ 对于删除操作,它必须借助辅助节点帮助进行删除 所以为了克服这些缺点,我们引出了双向链表。 一.基本介绍 双向链表它的方向是双向的,相对于单向链表它可以实现自我删除。 双向链表的节点包含三个量,首先一个还是节点信息data,还有指向下一个节点地址的next指针,最后添加了指向前一个节点地址的pre指针。 实现思路: ∙\bullet.

taoxing 2525

mysql 双向链表_双向链表

双向链表是链表变型,相比于单链表导航或者是向前和向后的两种方式。以下是重要的术语来理解双向链表的概念Link− 链表的每个链路存储数据称为一个元素。Next− 链表的每个链接包含一个链接到下一个被称为下一个(Next)。Prev− 链表的每个链接包含一个链接,称为上一个链接(Prev)。LinkedList− LinkedList包含连接链接到名为首先第一个链接,并称为最后的最后一个链接(...

weixin_36475451的博客 596
上一篇: String类
下一篇: String Copy_on_write
MJ813
博客等级 码龄12年 269粉丝 109原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值