【数据结构与算法】链表超全分类!从结构入门到双向链表初始化实现

【数据结构与算法】链表超全分类!从结构入门到双向链表初始化实现
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介:C++研发,嵌入式,机器人等方向学习者
❄️个人专栏:《C语言》《【初阶】数据结构与算法》
永远相信美好的事情即将发生
在这里插入图片描述

文章目录


前言

链表是数据结构入门阶段的核心知识点,其结构灵活多变,可分为单向 / 双向、带头 / 不带头、循环 / 不循环等多种形式。本文先系统梳理链表的分类,帮助大家建立完整认知,再重点讲解带头双向循环链表这一高效实用的结构。从节点定义、哨兵位初始化到完整代码实现,一步步带你理解双向链表的设计思想,为后续增删改查等操作打下坚实基础。

一、链表的分类与说明

链表的结构非常多样,总共能组合出来8种

在这里插入图片描述

1.1 单向或者双向

双向链表分为前驱节点和后继节点:不仅能找到当前节点的下一个节点还可以找到上一个节点,使用起来也是很方便的。

在这里插入图片描述

1.2 带头或者不带头

带头链中的头节点,不存储任何有效数据,只用来站岗放哨,我们也称之为"哨兵位"

在之前的单链表学习中,我们有时候也会把第一个节点表述为头节点,其实这个称呼是不严谨的只是为了方便理解。
在这里插入图片描述

1.3 循环或者不循环

循环链表的尾节点不会指向空,而是指向了第一个节点

在这里插入图片描述

虽然有这么多的链表结构,但我们实际中最常用的其实还是两种:单链表(不带头单向不循环链表)和双向链表(带头双向循环链表) ,那我们一起来继续学习双向链表吧

二、双向链表

2.1 双向链表的定义

双向链表中由一个一个的节点组成,这里的节点有三个组成部分:
前驱指针: 指向前一个元素的指针
后驱指针: 指向后一个元素的指针
数值域: 存储元素

typedef structListNode{structListNode* prev;//前驱structListNode* next;//后继LDataType data;}ListNode;

2.2 双向链表中哨兵位头节点的初始化

双向链表中哨兵位的头节点是需要初始化一下的,数据随便给个不用的,然后前驱和后继指针都指向自己就可以了 ` voidLTInt(ListNode** pphead){ ListNode* ph =(ListNode*)malloc(sizeof(ListNode));if(ph == NULL){printf("开辟失败!\n");exit(-1);}*pphead = ph;(*pphead)->data =-1;//看个人习惯(*pphead)->next =*pphead;(*pphead)->prev =*pphead;}

三、代码展现

3.1 List.h

#include <stdio.h>#include <stdlib.h>#include <assert.h> typedef int LDataType; typedef structListNode{structListNode* prev;//前驱structListNode* next;//后继LDataType data;}ListNode;//初始化voidLTInt(ListNode** head);

3.2 List.c

#include "List.h"//初始化voidLTInt(ListNode** pphead){ ListNode* ph =(ListNode*)malloc(sizeof(ListNode));if(ph == NULL){printf("开辟失败!\n");exit(-1);}*pphead = ph;(*pphead)->data =-1;//看个人习惯(*pphead)->next =*pphead;(*pphead)->prev =*pphead;}

3.3 test.c

#include "List.h"intmain(){ ListNode* head;LTInt(&head);return0;}

总结与每日励志

✨本文详细介绍了链表的多种分类方式,并实现了带头双向循环链表的初始化逻辑,让大家清晰认识双向链表的结构优势与哨兵位的作用。数据结构的学习,重在理解结构本质与设计思路。✨ 一步一个脚印夯实基础,把每一个知识点学透、每一段代码写稳,坚持深耕下去,你的编程能力必将稳步提升,永远相信美好的事情即将发生。

在这里插入图片描述

Read more

【动态规划】多歧路 , 今安在? - 路径问题

【动态规划】多歧路 , 今安在? - 路径问题

本篇博客给大家带来的是路径问题之动态规划解法技巧. 🐎文章专栏: 动态规划 🚀若有问题 评论区见 ❤ 欢迎大家点赞 评论 收藏 分享 如果你不知道分享给谁,那就分享给薯条. 你们的支持是我不断创作的动力 . 王子,公主请阅🚀 * 要开心 * 要快乐 * 顺便进步 * * * * 1. 不同路径 * 2. 不同路径 II * 3. 珠宝的最高价值 要开心 要快乐 顺便进步 1. 不同路径 题目链接:62. 不同路径 题目内容: 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1: 输入:m = 3,

By Ne0inhk
coding ability 展开第七幕(前缀和算法——进阶巩固)超详细!!!!

coding ability 展开第七幕(前缀和算法——进阶巩固)超详细!!!!

文章目录 * 前言 * 和为k的子数组 * 思路 * 和可被k整除的子数组 * 思路 * 连续数组 * 思路 * 矩阵区域和 * 思路 * 总结 * 总结 前言 本专栏上篇博客带大家了解了前缀和的有关模版以及习题的训练 从一维到二维的拓展,今天我们继续来练习一下前缀和的有关算法 fellow me 和为k的子数组 思路 设 i 为数组中的任意位置,用 sum[i] 表示 [0, i] 区间内所有元素的和。 想知道有多少个**「以 i 为结尾的和为 k 的子数组」,就要找到有多少个起始位置为 x1, x2,x3… 使得 [x, i] 区间内的所有元素的和为 k 。那么 [0, x] 区间内的和是不是就是sum[i]

By Ne0inhk
基于YOLOv10算法的交通信号灯检测与识别

基于YOLOv10算法的交通信号灯检测与识别

目录 * 一.🦁 写在前面 * 1.1 实现模块划分 * 1.2 优化与实时性支持 * 二.🦁 相关技术与理论基础 * 2.1 各版本yolo对比 * 2.2 YOLOv10网络结构 * 三.🦁 结果分析 * 3.1 训练损失与验证损失分析 * 3.2 精确率(Precision)、召回率(Recall)和平均精度(mAP)分析 * 四.🦁 实现界面 * 4.1 用户界面实现 * 4.2 检测能力实现 * 4.3 视频处理检测 * 4.4 图片处理检测 * 五.🦁 写在最后 随着城市化进程的加速,交通问题日益严峻,特别是在智能交通和自动驾驶领域,

By Ne0inhk
排序算法指南:归并排序(非递归)

排序算法指南:归并排序(非递归)

前言:              非递归实现归并排序,通常被称为 “自底向上”(Bottom-Up) 的归并排序,与递归版本(先将数组对半拆分直到只剩一个元素,再通过递归栈回溯合并)不同,非递归版本直接从最小的子数组(长度为1)开始,两两合并,然后长度翻倍(2, 4, 8 ...),直到合并完整个数组。                                                                 一、归并排序非递归的核心思路          递归算法转换为非递归实现主要有两种常见方法:          1.使用栈结构模拟递归过程          2.将递归逻辑改写为循环结构          1.1 栈模拟失效          如果仅通过栈结构模拟递归过程,我们只能够做到拆分数组,而不能做到合并数组。          假设我们要排序数组 arr = [8, 4, 5, 7],下标是 0 到 3。          初始状态:栈中有任务 [0, 3]。                   第一步:弹

By Ne0inhk