【落羽的落羽 数据结构篇】双向链表

news2025/7/7 5:12:56

在这里插入图片描述

文章目录

  • 一、链表的分类
  • 二、双向链表
    • 1. 结构
    • 2. 申请一个新节点
    • 3. 尾部插入数据
    • 4. 头部插入数据
    • 5. 尾部删除数据
    • 6. 头部删除数据
    • 7. 在指定位置之后插入数据
    • 8. 删除指定位置节点
    • 9. 销毁链表

一、链表的分类

链表的分类实际上要从这三个方向分析:是否带头、单向还是双向、是否循环。

“带头”指链表是否有“头节点”,并不指链表的第一个节点,而是一个不存储有效数据的“哨兵位”,作用仅仅是表明链表的起始点。上次讲的单链表中我们说的“首节点”,只是链表的第一个存储数据的节点,并不是头节点,这个单链表是没有头结点的

单链表是单向链表,也存在双向链表,也就是这种链表的节点有两个指针成员,一个指向下一个节点、一个指向上一个节点。

循环就很好理解了,节点的指针成员循环指向。

所以,理论上我们能把链表分为2×2×2=8种:带头单向不循环链表、不带头双向不循环链表、带头双向循环链表……
上次我们学习的“单链表”,全称应该就是“不带头单向不循环链表”。而我们这次要学习的“双向链表”,全称是“带头双向循环链表”。这两种链表也是最常用的两种。

在这里插入图片描述

二、双向链表

1. 结构

typedef struct LTNode
{
	LTDataType data;
	struct LTNode* next;
	struct LTNode* prev;
}LTNode;

这是双向链表的每一个节点的结构。next指针指向下一个节点,prev指针指向上一个节点
值得注意的是,单链表为空时,链表一个节点都没有;双向链表为空时,它仍有一个哨兵位,如果连哨兵位都没有的话,这不是双向链表而是单链表。同时,这个哨兵位的next指针和prev指针都是指向自己的。
在这里插入图片描述
在这里插入图片描述

2. 申请一个新节点

LTNode* BuyNode(LTDataType x)
{  
	LTNode* newnode = (LTNode*)malloc(sizeof(LTNode));
	assert(newnode);
	newnode->data = x;
	newnode->next = newnode->prev = newnode;
	return newnode;
}

测试:
在这里插入图片描述

3. 尾部插入数据

这里的“尾部”,是头结点的prev指针指向的位置

void LTPushBack(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* newnode = BuyNode(x);
	newnode->next = phead; //新尾结点的next指向头结点
	newnode->prev = phead->prev; //新尾结点的prev指向原尾结点
	phead->prev->next = newnode; //原尾结点的next指向新尾结点
	phead->prev = newnode; //头结点的prev指向新尾结点
}

测试:
在这里插入图片描述
在这里插入图片描述

4. 头部插入数据

“头部”是头结点的next指向的位置

void LTPushFront(LTNode* phead, LTDataType x)
{
	assert(phead);
	LTNode* newnode = BuyNode(x);
	newnode->next = phead->next;
	newnode->prev = phead;
	phead->next->prev = newnode;
	phead->next = newnode;
}

测试:
在这里插入图片描述
在这里插入图片描述

5. 尾部删除数据

void LTPopBack(LTNode* phead)
{
	assert(phead != phead->next); //保证原链表不为空,否则无数据可删
	LTNode* del = phead->prev; //要删除的节点设置成del
	del->prev->next = phead; //del的前一个节点的next指向头结点
	phead->prev = del->prev; //头结点的prev指向del的前一个节点
	free(del);
	del = NULL;
}

测试:
在这里插入图片描述

6. 头部删除数据

void LTPopFront(LTNode* phead)
{
	assert(phead != phead->next);
	LTNode* del = phead->next;
	del->next->prev = phead;
	phead->next = del->next;
	free(del);
	del = NULL;
}

测试:在这里插入图片描述

7. 在指定位置之后插入数据

void LTInsert(LTNode* pos, LTDataType x)
{
	assert(pos);
	LTNode* newnode = BuyNode(x);
	newnode->prev = pos;
	newnode->next = pos->next;
	pos->next->prev = newnode;
	pos->next = newnode;
}

测试:
在这里插入图片描述

8. 删除指定位置节点

void LTErase(LTNode* pos)
{
	assert(pos);
	pos->next->prev = pos->prev;
	pos->prev->next = pos->next;
	free(pos);
	pos = NULL;
}

测试:
在这里插入图片描述

9. 销毁链表

void LTDestory(LTNode* phead)
{
	LTNode* pcur = phead->next;
	while (pcur != phead)
	{
		LTNode* next = pcur->next;
		free(pcur);
		pcur = next;
	}
	free(phead);
	phead = NULL;
}

测试:
在这里插入图片描述

本篇完,感谢阅读

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Golang的并发编程问题解决思路

Golang的并发编程问题解决思路 一、并发编程基础 并发与并行 在计算机领域,“并发”和“并行”经常被混为一谈,但它们有着不同的含义。并发是指一段时间内执行多个任务,而并行是指同时执行多个任务。在 Golang 中,通过 goroutines…

剑指offer第2版:搜索算法(二分/DFS/BFS)

查找本质就是排除的过程,不外乎顺序查找、二分查找、哈希查找、二叉排序树查找、DFS/BFS查找 一、p39-JZ3 找出数组中重复的数字(利用特性) 数组中重复的数字_牛客题霸_牛客网 方法1:全部排序再进行逐个扫描找重复。 时间复杂…

在 CentOS 上更改 SSH 默认端口以提升服务器安全性

🚀 作者主页: 有来技术 🔥 开源项目: youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template 🌺 仓库主页: GitCode︱ Gitee ︱ Github 💖 欢迎点赞 👍 收藏 ⭐评论 …

2025年:边缘计算崛起下运维应对新架构挑战

一、引言 随着科技的飞速发展,2025年边缘计算正以前所未有的速度崛起,给运维行业带来了全新的架构挑战。在这个充满机遇与挑战的时代,美信时代公司的美信监控易运维管理软件成为运维领域应对这些挑战的有力武器。 二、边缘计算崛起带来的运维…

怎么理解 Spring Boot 的约定优于配置 ?

在传统的 Spring 开发中,大家可能都有过这样的经历:项目还没开始写几行核心业务代码,就已经在各种配置文件中耗费了大量时间。比如,要配置数据库连接,不仅要在 XML 文件里编写冗长的数据源配置,还要处理事务…

学习总结2.14

深搜将题目分配&#xff0c;如果是两个题目&#xff0c;就可以出现左左&#xff0c;左右&#xff0c;右左&#xff0c;右右四种时间分配&#xff0c;再在其中找最小值&#xff0c;即是两脑共同处理的最小值 #include <stdio.h> int s[4]; int sum0; int brain[25][25]; …

Electron 客户端心跳定时任务调度库调研文档 - Node.js 任务调度库技术调研文档

Electron 客户端心跳定时任务调度库调研文档 - Node.js 任务调度库技术调研文档 本文将对七个流行的定时任务调度库&#xff1a;node-cron、rxjs、bull、node-schedule、agenda、bree、cron。这些库都可以用来处理定时任务&#xff0c;但它们的特点和适用场景有所不同。我们将从…

【学术投稿-第四届智能电网和绿色能源国际学术会议(ICSGGE 2025)】CSS基本选择器详解:掌握基础,轻松布局网页

可线上 官网&#xff1a;www.icsgge.org 时间&#xff1a;2025年2月28-3月2日 目录 前言 一、基本选择器简介 1. 元素选择器&#xff08;Type Selector&#xff09; 基本语法 示例 注意事项 2. 类选择器&#xff08;Class Selector&#xff09; 基本语法 示例 注意…

singleTaskAndroid的Activity启动模式知识点总结

一. 前提知识 1.1. 任务栈知识 二. Activity启动模式的学习 2.1 standard 2.2 singleTop 2.3.singleTask 2.4.singleInstance 引言&#xff1a; Activity作为四大组件之一&#xff0c;也可以说Activity是其中最重要的一个组件&#xff0c;其负责调节APP的视图&#xff…

Vue 入门到实战 十

第10章 Vue Router​​​​​​​ 目录 10.1 什么是路由 10.2 Vue Router的安装 10.2.1 本地独立版本方法 10.2.2 CDN方法 10.2.3 NPM方法 10.2.4 命令行工具&#xff08;Vue CLI&#xff09;方法 10.3 Vue Router的基本用法 10.3.1 跳转与传参 10.3.2 配置路由 10.…

jenkins-获取当前时间戳

一. 简述&#xff1a; 很多场景下&#xff0c;需要获取当前时间戳。 二. 使用方法&#xff1a; 1. 安装&#xff1a; 最简单的&#xff0c; 莫过于直接部署相关插件&#xff1a; Build Timestamp Plugin 2. 配置&#xff1a; 3. 使用&#xff1a; post {success {script…

【Jenkins流水线搭建】

Jenkins流水线搭建 01、SpringBoot项目 - Jenkins基于Jar持续集成搭建文档基于手动方式发布项目基于dockerfile基于jenkins + dockerfile + jenkinsfile +pieline基于jenkins + jar方式的发布01、环境说明01、准备项目02、准备服务器03、安装git04、安装jdk1.805、安装maven依赖…

【Java】规则引擎 Drools

https://www.bilibili.com/video/BV1nW421R7qJ 来自尚硅谷 背景 /*** 设置订单积分*/ public void setOrderPoint(Order order){if (order.getAmout() < 100){order.setScore(0);}else if(order.getAmout() > 100 && order.getAmout() < 500){order.setScore(…

深入浅出Java反射:掌握动态编程的艺术

小程一言反射何为反射反射核心类反射的基本使用获取Class对象创建对象调用方法访问字段 示例程序应用场景优缺点分析优点缺点 注意 再深入一些反射与泛型反射与注解反射与动态代理反射与类加载器 结语 小程一言 本专栏是对Java知识点的总结。在学习Java的过程中&#xff0c;学习…

数据挖掘智能Agent

&#x1f917; CodeGenie - 智能编程助手 数据处理和分析对于数据分析工作人员来说&#xff0c;往往既复杂又令人头疼&#xff0c;需要耗费大量精力进行重复性工作。为了解决这一问题&#xff0c;我们开发了一款集成了自然语言处理和代码生成功能的智能编程助手——CodeGenie。…

动手学深度学习11.7. AdaGrad算法-笔记练习(PyTorch)

以下内容为结合李沐老师的课程和教材补充的学习笔记&#xff0c;以及对课后练习的一些思考&#xff0c;自留回顾&#xff0c;也供同学之人交流参考。 本节课程地址&#xff1a;72 优化算法【动手学深度学习v2】_哔哩哔哩_bilibili 本节教材地址&#xff1a;11.7. AdaGrad算法…

基础算法# 求一个数的二进制表示当中有几个1 (C++)

文章目录 题目链接题目解读思路完整代码参考 题目链接 题目解读 给定L,R。统计[L,R]区间内的所有数在二进制下包含的“1”的个数之和。 如5的二进制为101&#xff0c;包含2个“1”。 思路 直接将该数字转为二进制表示,求其有几个1即可。 完整代码 #include<bits/stdc.…

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题

【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题 【承接商业广告,如需商业合作请+v17740568442】 文章目录 【linux】在 Linux 上部署 DeepSeek-r1:32/70b:解决下载中断问题问题描述:解决方法方法一:手动中断并重启下载方法二:使用 Bash 脚本自动化下载在…

SpringBoot+Vue+微信小程序的高校食堂点餐系统

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 食堂点餐系统&#xff0c;作为一款融合现代信息技术的高效餐饮服务利器&#xff0c;以其…

大预言模型|微调大预言模型初探索(LLaMA-Factory)(1)

前言 微调模型通常比从零开始训练一个模型的技术要求低。公司不需要拥有大量的深度学习专家&#xff0c;利用现有的开源工具和库&#xff08;如Hugging Face的Transformers等&#xff09;&#xff0c;中小型公司可以轻松地使用和微调大型模型&#xff0c;从而快速实现AI能力的集…