数据结构学习笔记 :线性表的链式存储详解

目录

  1. 单链表
    1.1 无头单链表
    1.2 有头单链表
  2. 单向循环链表
  3. 双链表
    3.1 双链表
    3.2 双向循环链表
  4. 总结与对比

一、单链表

1. 无头单链表(Headless Singly Linked List)

定义:链表无头结点,直接由头指针指向第一个数据节点。

特点

  • 插入/删除第一个节点需特殊处理。
  • 空链表时头指针为NULL
核心代码
typedef struct LNode {int data;struct LNode *next;
} LNode, *LinkList;bool InitList(LinkList *L) {*L = NULL;return true;
}bool insert_head(LinkList *L, LNode *new) {if (new == NULL) return false;new->next = *L;*L = new;return true;
}

示例操作
int main() {LinkList list;InitList(&list);LNode *node = newnode(11);insert_head(&list, node); // 头部插入// ... 其他操作return 0;
}


2. 有头单链表(Singly Linked List with Header)

定义:链表包含头结点,头指针始终指向头结点。

优点

  • 插入/删除第一个节点与普通节点操作统一。
  • 空链表时头指针不为NULL,统一处理逻辑。
核心代码
bool InitList(LinkList *L) {*L = (LNode*)malloc(sizeof(LNode));(*L)->next = NULL;return true;
}bool insert_head(LinkList L, LNode *new) {new->next = L->next;L->next = new;return true;
}bool insert_tail(LinkList L, LNode *new) {LNode *p = L;while (p->next != NULL) p = p->next;p->next = new;return true;
}

示例操作
int main() {LinkList list;InitList(&list);LNode *node = newnode(11);insert_head(list, node); // 头部插入node = newnode(88);insert_tail(list, node); // 尾部插入// ... 其他操作return 0;
}


二、单向循环链表(Circular Linked List)

定义:链表最后一个节点的next指向头结点,形成循环。

特点

  • 支持从任意节点开始遍历整个链表。
  • 删除操作需注意头结点的特殊处理。
核心代码
bool InitList(DLinkList *L) {*L = (LNode*)malloc(sizeof(LNode));(*L)->next = *L;return true;
}bool insert_head(LinkList L, LNode *new) {new->next = L->next;L->next = new;return true;
}LNode* delete_tail(LinkList L) {LNode *p = L, *q = L->next;while (q->next != L) {p = q;q = q->next;}p->next = L;return q;
}


三、双链表(Doubly Linked List)

1. 双链表

定义:每个节点包含prevnext指针,支持双向遍历。

特点

  • 可高效实现插入/删除操作(需同时维护前后指针)。
  • 需额外存储空间。
核心代码
typedef struct DNode {int data;struct DNode *prev, *next;
} DNode, *DLinkList;bool insert_head(DLinkList L, DNode *new) {new->next = L->next;new->prev = L;if (L->next != NULL) L->next->prev = new;L->next = new;return true;
}DNode* delete(DLinkList L, DNode *node) {if (node == L) return NULL;node->prev->next = node->next;if (node->next != NULL) node->next->prev = node->prev;return node;
}


2. 双向循环链表(Circular Doubly Linked List)

定义:双链表最后一个节点的next指向头结点,头结点的prev指向尾节点。

特点

  • 支持高效双向遍历和循环操作。
  • 操作需处理循环指针。
核心代码
bool InitList(DLinkList *L) {*L = (DNode*)malloc(sizeof(DNode));(*L)->next = *L;(*L)->prev = *L;return true;
}bool insert_head(DLinkList L, DNode *new) {new->next = L->next;new->prev = L;L->next->prev = new;L->next = new;return true;
}DNode* delete_tail(DLinkList L) {DNode *p = L->prev;p->prev->next = L;L->prev = p->prev;return p;
}


四、总结与对比

结构类型插入/删除时间复杂度优点缺点
无头单链表O(n)简单头部操作需特殊处理
有头单链表O(1)(头插)操作统一需额外头结点空间
单向循环链表O(1)(头插)支持循环遍历需处理循环指针
双链表O(1)(双向操作)支持双向遍历空间占用更大
双向循环链表O(1)(双向操作)完全循环遍历实现复杂度最高

关键点总结

  1. 头结点的作用:统一操作逻辑,避免空指针问题。
  2. 循环链表的优势:遍历无需判断尾节点,适合需要循环遍历的场景。
  3. 双链表的适用场景:需要频繁双向遍历或快速删除节点的场景(如浏览器历史记录)。

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

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

相关文章

数据库10(代码相关语句)

while循环 declare avgprice numeric(10,2) set avgprice(select avg(price)from titles) //自定义参数 while avgprice<10 //循环条件 begin update titles set priceprice*1.1 end //循环语句操作&#xff0c;当avgprice<10,所有price都加0.1 case语句 查询authors表…

Redis 下载与安装(Windows版)

一、下载 1、redis官网&#xff1a; https://redis.io/downloads/ 2、Github下载地址&#xff1a; https://github.com/MicrosoftArchive/redis/releases 二、安装 1、打开一个命令窗口&#xff0c;通过 cd 命令进入到你解压的目录 2、输入命令 &#xff0c;启动 Redis&…

在高数据速度下确保信号完整性的 10 个关键策略

随着越来越多的传感器连接到系统&#xff0c;需要快速、可靠和安全地传输更多数据&#xff0c;对带宽和设计复杂性的需求也在增加。优先考虑的是确保从 A 发送到 B 的信号不会失真。 确保信号完整性 对于设计依赖于持续准确数据流的数据密集型应用程序的工程师来说&#xff0c…

NAT、代理服务、内网穿透

NAT、代理服务、内网穿透 1、NAT1.1、NAT过程1.2、NAPT2、内网穿透3、内网打洞3、代理服务器3.1、正向代理3.2、反向代理1、NAT 1.1、NAT过程 之前我们讨论了IPv4协议中IP地址数量不充足的问题。NAT技术是当前解决IP地址不够用的主要手段,是路由器的一个重要功能。 NAT能够将…

利用互斥锁或者利用逻辑过期解决缓存击穿问题

缓存击穿问题概述 缓存击穿是指某个 热点数据缓存过期 时&#xff0c;大量并发请求直接穿透缓存&#xff0c;同时访问数据库&#xff0c;导致数据库压力骤增甚至崩溃。以下是基于 互斥锁 和 逻辑过期 的解决方案&#xff1a; 一、缓存击穿的核心原因 热点数据失效&#xff1a…

Vue3组合式API内核解析:从原子状态到企业级架构

一、组合逻辑原子化设计 1.1 状态管理层级拓扑 1.2 组合单元类型对照表 类型典型实现适用场景复用维度UI逻辑单元useForm/useTable表单/列表交互100%跨项目复用业务逻辑单元useOrderFlow订单流程控制同项目跨模块设备能力单元useGeolocation地理位置获取跨技术栈复用状态管理…

新生宿舍管理系统

收藏关注不迷路&#xff01;&#xff01; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff08;免费咨询指导选题&#xff09;&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;希望帮助更多…

从零上手GUI Guider学习LVGL——Button

视频教程请关注我b站&#xff1a;同学_好好学习&#xff0c;这里只是做相应的笔记文稿 从零上手GUI Guider学习LVGL——Buttton 前言&#xff1a; 首先我们为什么要学习LVGL设计工具呢&#xff1f; 1 降低开发难度 2 提高开发效率 所以我们需要学习一款合适的设计工具 在b站很少…

【AAOS】【源码分析】Car UX Restrictions

AAOS UX的核心理念:安全驾驶是驾驶员的首要责任。汽车制造商和应用程序开发人员的所有设计都必须反映这一优先事项。 AAOS平台允许设备制造商(OEM)对不同驾驶状态下的限制进行定制。 驾驶员分心指南 只有符合Driver Distraction Guidelines的应用才可以在驾驶过程中运行。…

jvm调优工具arthas(阿尔萨斯)安装与使用---实践

jvm调优工具arthas(阿尔萨斯)安装与使用—实践 Arthas 是Alibaba开源的Java诊断工具&#xff0c;深受开发者喜爱。 当你遇到以下类似问题而束手无策时&#xff0c;Arthas可以帮助你解决&#xff1a; 这个类从哪个 jar 包加载的&#xff1f;为什么会报各种类相关的 Exception…

机器学习期末

选择题 以下哪项不是机器学习的类型&#xff1f; A. 监督学习 B.无监督学习 C.半监督学习 D.全监督学习 D 哪一个是机器学习的合理定义? A、机器学习是计算机编程的科学 B、机器学习从标记的数据中学习 C、机器学习是允许机器人智能行动的领域 D、机器学习能使计算机能够在…

3DMAX粒子流样条线生成器PFSpliner使用方法详解

3DMAX粒子流样条线生成器&#xff0c;是一款功能强大且富有创意的工具。它能够为“粒子流源”的每一个粒子生成专属的动画样条线&#xff0c;这些样条线描绘出粒子在空间中的运动轨迹&#xff0c;就如同为粒子绘制出了一条条独特的“运动地图”。更为出色的是&#xff0c;这些样…

Maven中clean、compil等操作介绍和Pom.xml中各个标签介绍

文章目录 前言Maven常用命令1.clean2.vaildate3.compile4.test5.package6.verify7.install8.site9.deploy pom.xml标签详解格式<?xml version"1.0" encoding"UTF-8"?>(xml版本和编码)modelVersion&#xff08;xml版本&#xff09;groupId&#xff…

Centos7.6安装JDK 1.8教程

前提&#xff1a;先把jdk1.8文件上传到usr/local目录下&#xff0c;文件名如&#xff1a;jdk-8u151-linux-x64.tar.gz 1. 解压 JDK 压缩包 假设 jdk-8u151-linux-x64.tar.gz 文件位于 /usr/local 目录下。 进入 /usr/local 目录&#xff1a; cd /usr/local 解压文件&#…

EuroCropsML:首个面向少样本时间序列作物分类的多国基准数据集

2025-04-15&#xff0c;由慕尼黑工业大学等机构创建的 EuroCropsML 数据集&#xff0c;这是一个结合了农民报告的作物数据与 Sentinel-2 卫星观测的时间序列数据集&#xff0c;覆盖了爱沙尼亚、拉脱维亚和葡萄牙。该数据集为解决遥感应用中作物类型数据空间不平衡问题提供了新的…

将python项目打包成Windows后台服务

前文,我开发了一个基于windows11与本地deepseek实现的语音助手,之前是通过CMD直接执行项目的main.py文件。但是这样不适合移植,现在想将其生成一个exe文件,以及部署成windows的后台服务。 关于语音助手的开发与发布,可以看的CSDN文章:一个基于windows11与本地deepseek实…

yolov8复现

Yolov8的复现流程主要包含环境配置、下载源码和验证环境三大步骤&#xff1a; 环境配置 查看电脑状况&#xff1a;通过任务管理器查看电脑是否有独立显卡&#xff08;NVIDIA卡&#xff09;。若有&#xff0c;后续可安装GPU版本的pytorch以加速训练&#xff1b;若没有&#xff0…

Yocto项目实战教程 · 第4章:4.1小节元数据

&#x1f50d; B站相应的视频教程&#xff1a; &#x1f4cc; Yocto项目实战教程-第4章-4.1小节-元数据 记得三连&#xff0c;标为原始粉丝。 在嵌入式Linux系统构建中&#xff0c;Yocto项目凭借其高度模块化、可配置的特性成为主流工具。而其背后的关键支撑之一&#xff0c;便…

《AI大模型应知应会100篇》第23篇:角色扮演技巧:让AI成为你需要的专家

第23篇&#xff1a;角色扮演技巧&#xff1a;让AI成为你需要的专家 摘要 在当今人工智能快速发展的时代&#xff0c;大模型已经不仅仅是简单的问答工具&#xff0c;它们可以通过角色扮演技巧模拟各类专家身份&#xff0c;从而为用户提供更专业、更有针对性的服务。本文将深入探…

Windows系统安装RustDesk Server的详细步骤和客户端设置

Windows系统安装RustDesk Server的详细步骤 在Windows系统上安装RustDesk Server涉及几个关键步骤,包括安装必要的依赖、下载RustDesk Server程序、配置并启动服务。以下是详细的步骤: 1. 安装Node.js和PM2 RustDesk Server的某些版本可能需要Node.js环境来运行,而PM2是一…