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

【数据结构与算法】链表超全分类!从结构入门到双向链表初始化实现
在这里插入图片描述
🔥小龙报:个人主页
🎬作者简介: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

【贪心算法】day1

【贪心算法】day1

📝前言说明: * 本专栏主要记录本人的贪心算法学习以及LeetCode刷题记录,按专题划分 * 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话);(4)这个贪心算法正确性的证明 * 文章中的理解仅为个人理解。如有错误,感谢纠错 🎬个人简介:努力学习ing 📋本专栏:C++刷题专栏 📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux 🎀ZEEKLOG主页 愚润泽 你可以点击下方链接,进行其他贪心算法题目的学习 点击链接开始学习贪心day1贪心day2贪心day3贪心day4贪心day5贪心day6贪心day7贪心day8贪心day9贪心day10 也可以点击下面连接,学习其他算法 点击链接开始学习优选专题动态规划递归、搜索与回溯贪心算法 题单获取→ 【贪心算法】题单汇总 题目 * 贪心算法导论 * 860. 柠檬水找零 * 优质解 * 证明 * 2208. 将数组和减半的最少操作次数

By Ne0inhk
【LeetCode面试题17.04】消失的数字

【LeetCode面试题17.04】消失的数字

刷爆LeetCode系列 * LeetCode面试题17.04:消失的数字 * github地址 * 前言 * 题目描述 * 题目与思路分析 * 目标分析 * 思路一:数组哈希 * 思路二:数学求和 * 思路三:位运算(异或) * 代码实现 * 思路一:数组哈希 * 思路二:数学求和 * 思路三:位运算 * 算法代码优化 * 结语 LeetCode面试题17.04:消失的数字 github地址 有梦想的电信狗 前言 本文用C++三种方法实现LeetCode面试题17.04:消失的数字 * 方法一:数组哈希 * 方法二:数学求和再相减 * 方法三:位运算 题目描述 题目链接:https://leetcode.cn/problems/missing-number-lcci/description/ 题目与思路分析

By Ne0inhk
【优选算法必刷100题】第027~28题(前缀和算法):寻找数组的中心下标、除自身以外数组的乘积

【优选算法必刷100题】第027~28题(前缀和算法):寻找数组的中心下标、除自身以外数组的乘积

🔥艾莉丝努力练剑:个人主页 ❄专栏传送门:《C语言》、《数据结构与算法》、C/C++干货分享&学习过程记录、Linux操作系统编程详解、笔试/面试常见算法:从基础到进阶 ⭐️为天地立心,为生民立命,为往圣继绝学,为万世开太平 🎬艾莉丝的简介: 🎬艾莉丝的算法专栏简介: 目录 027  寻找数组的中心下标  1.1  算法思路:前缀和 1.2  算法实现 1.2.1  C++实现 1.2.2  Java实现 1.3  博主手记 028  除自身以外数组的乘积 2.1  算法思路 2.2  算法实现

By Ne0inhk
【C语言】排序算法——希尔排序以及插入排序 ——详解!!!

【C语言】排序算法——希尔排序以及插入排序 ——详解!!!

【C语言】排序算法——希尔排序以及插入排序详解 * 前言 * 一 、插入排序 * 1. 视频演示 * 2. 算法思想 * 3. 实现思路 * 4. 代码演示 * 二 、希尔排序 * 1. 视频演示 * 2. 算法思想 * 3. 实现思路 * (1)分组 * (2)预排序 * (3)最终排序 * (4)gap的取值 * 4. 代码演示 * 结语 前言 在学习循环的时候,我们学习到了冒泡排序这个算法 那么,除了冒泡排序,还有什么排序算法呢? 今天给大家带来的是插入排序以及希尔排序 一 、插入排序 1. 视频演示 首先给大家看一段视频,让大家先看看插入排序是怎么运行的 插入排序演示 2. 算法思想 我们可以从视频里看见,

By Ne0inhk