数据结构基础 - 链表操作

单元2 链表操作详解:插入、删除、读取及指针修改次数 以下针对四种链表类型(单链表、双链表、循环单链表、循环双链表),详细说明插入、删除、读取操作步骤及指针修改次数(仅统计已有节点的指针修改,不包括新节点初始化或删除节点释放)。 1. 单链表(Singly Linked List) 节点结构:数据 + next指针(指向后继) 插入操作(在节点A和B之间插入C): 步骤: 创建新节点C,设置 C.next = B(新节点初始化,不计入修改)。 修改A的 next 指针指向C:A.next = C。 指针修改次数:1次(仅修改前驱节点A的指针)。 边界情况: 头部插入:修改头指针指向C(头指针修改不计入节点指针修改)。 尾部插入:同一般情况(修改原尾节点的 next)。 删除操作(删除节点B,A为其前驱): 步骤: 修改A的 next 指针指向B的后继:A.next = B.next。 释放B(不计入指针修改)。 指针修改次数:1次(仅修改前驱节点A的指针)。 边界情况: 删除头节点:修改头指针指向原头节点的后继(头指针修改不计入节点指针修改)。 删除尾节点:修改倒数第二节点的 next 为 null(1次修改)。 读取操作: 仅支持顺序访问:从头节点遍历,时间复杂度 O(n)。 不支持随机访问(无索引)。 2. 双链表(Doubly Linked List) 节点结构:数据 + next指针(指向后继) + prev指针(指向前驱) 插入操作(在节点A和B之间插入C): 步骤: 创建新节点C,设置 C.prev = A, C.next = B(新节点初始化)。 修改A的 next 指针指向C:A.next = C。 修改B的 prev 指针指向C:B.prev = C。 指针修改次数:2次(修改前驱A的 next 和后继B的 prev)。 边界情况: 头部插入:需修改原头节点的 prev 指向C(1次修改)。 尾部插入:需修改原尾节点的 next 指向C(1次修改)。 删除操作(删除节点B): ...

2025-7-22 · 2 分钟 · Atom.X

数据结构基础 - 栈与队列

栈和队列有哪些特殊的操作?栈和队列能解决什么样的问题?用栈和队列这种数据结构,来解决与“先进先出”、“先进后出”有关的实际问题了,如宽度优先搜索、表达式求值等。 常生活普遍规律 如果桌上有一叠盘子,大家都只会拿最上面的那一个。食堂排队的时候,你总是先找到队尾加入,而排在队首的同学打完饭之后就会离开。 类比计算机,也许只需要在线性序列的一端或两端进行操作,对应的就是栈和队列这两种受限的线性表,他们是最简单的基础数据结构,应用也最广泛。 重点:栈的 LIFO 特性,深度优先搜索,理解递归中栈的作用;队列的 FIFO 特性,宽度优先搜索。 难点:机械的递归转非递归,简单理解就可以了,不需要掌握;顺序队列的实现假溢出处理。

2025-7-22 · 1 分钟 · Atom.X

数据结构基础 - 顺序表 vs 链表

单元2 下面是一个简洁的 C++ 程序示例,展示了**顺序表(使用 vector)和链表(使用自定义单向链表)**的基本操作对比,包括插入、删除和访问元素: 🧪 顺序表 vs 链表:C++ 示例对比 ✅ 顺序表(使用 std::vector) #include <iostream> #include <vector> using namespace std; int main() { vector<int> seqList; // 插入元素 seqList.push_back(10); seqList.push_back(20); seqList.push_back(30); // 删除元素(删除第二个) seqList.erase(seqList.begin() + 1); // 访问元素 for (int i = 0; i < seqList.size(); ++i) { cout << "顺序表元素[" << i << "] = " << seqList[i] << endl; } return 0; } ✅ 链表(自定义单向链表) #include <iostream> using namespace std; struct Node { int data; Node* next; Node(int val) : data(val), next(nullptr) {} }; void insert(Node*& head, int val) { Node* newNode = new Node(val); newNode->next = head; head = newNode; } void deleteNode(Node*& head, int val) { Node* curr = head; Node* prev = nullptr; while (curr) { if (curr->data == val) { if (prev) prev->next = curr->next; else head = curr->next; delete curr; return; } prev = curr; curr = curr->next; } } void printList(Node* head) { int index = 0; while (head) { cout << "链表元素[" << index++ << "] = " << head->data << endl; head = head->next; } } int main() { Node* head = nullptr; // 插入元素(头插法) insert(head, 30); insert(head, 20); insert(head, 10); // 删除元素(删除值为 20 的节点) deleteNode(head, 20); // 打印链表 printList(head); return 0; } 📊 对比总结 特性 顺序表(vector) 链表(自定义) 插入效率 中间插入需移动元素,较慢 修改指针即可,效率高 删除效率 删除需移动元素 修改指针即可 随机访问 支持 O(1) 下标访问 需遍历,O(n) 内存结构 连续内存,缓存友好 分散内存,灵活扩展 实现复杂度 简单(STL支持) 需手动管理指针 单链表中,做插入数据的操作时,是否需要同时做两处数据的操作? 也就是修改前一个数据的后置链接指向,并增加新数据,例如在数据A和B之间插入C,首先要生成新的数据C,其后驱指针指向B,再修改前一个数据A的后驱指针,删除其与B的链接,建立与C的链接。 此外删除操作也是类似的的需要修改两处,该规则适用于双链表和循环链表。 ...

2025-7-21 · 2 分钟 · Atom.X

数据结构基础 - C/C++编程范式与模板

单元1 C++补充知识,关于 C语言与C++编程范式 以及 模板函数与模板类——融合整理为一份清晰系统的总结文章,完整展现 C/C++ 编程思想与核心机制 👇 🧠 C / C++ 编程范式与模板机制详解 一、C语言:典型的面向过程编程 C语言是计算机科学中广泛使用的一种底层语言,其编程范式是 面向过程(Procedure-Oriented Programming, POP)。 📌 面向过程核心理念 程序以“函数”为基本单位,强调从上到下的执行过程 问题被逐步拆解为多个函数,每个函数处理一个子任务 数据结构与操作行为分离,函数通过参数操控数据 🧪 C语言特征简述 特征 描述 模块化设计 使用函数实现各子过程 程序从 main() 执行 顺序调用各个逻辑步骤 struct 仅用于封装数据 不支持行为或方法定义 无类与对象机制 不具备封装、继承、多态 🧱 示例比较:冰箱装大象(C语言方式) openFridge(); putElephant(); closeFridge(); 强调函数的调用流程,数据通过参数传递,不具备对象概念。 二、C++:融合面向过程与面向对象 C++ 是基于 C 语言发展而来的一种多范式语言,既支持面向过程,又强调 面向对象(OOP) 和 泛型编程。 🔍 面向对象编程思想 程序以“对象”为单位组织,强调数据与行为的封装 引入类、对象、继承、多态等高级机制 更接近现实世界建模,适用于复杂系统开发 ⚙️ OOP 核心特性 特性 描述 封装 将数据和操作行为打包成一个对象 继承 子类继承父类属性和行为 多态 同一种操作可作用于不同类型对象 🧱 示例比较:冰箱装大象(C++ 面向对象方式) Fridge fridge; Elephant elephant; fridge.open(); fridge.put(elephant); fridge.close(); 对象封装行为,语义清晰,可扩展性强。 ...

2025-7-20 · 1 分钟 · Atom.X

数据结构基础 - 数据和算法类型

单元1 算法+数据结构 = 程序 算法:如何让计算机分析这些数据? 数据结构:如何把这些数据表示给计算机? 程序:如何让计算机明白我要做什么? 网课地址:数据结构基础 🧠 数据结构与算法效率总览 一、📦 抽象数据类型(ADT:Abstract Data Type) 抽象数据类型定义了一类数据的逻辑结构和操作方式,它不依赖具体的实现方式,是算法设计的基础。 ✨ ADT 特点: 封装性:隐藏内部存储与操作细节,只暴露接口 独立性:实现方式灵活(可用数组、链表等) 通用性:跨语言、跨平台适用 📚 常见 ADT 与实现方式及应用 ADT名称 描述 常见实现方式 应用场景举例 数组 固定大小,顺序排列 顺序存储 图像处理、表格数据 链表 节点动态链接 单/双向链表 内存分配、编辑器缓冲区 栈 后进先出(LIFO) 数组、链表 函数调用、撤销操作 队列 先进先出(FIFO) 链表、循环数组 消息调度、打印系统 集合 无序不重复元素集合 哈希表、树结构 数据去重、元素管理 映射(Map) 键值对集合 哈希表、搜索树 参数配置、缓存索引 堆(Heap) 特殊优先队列结构 完全二叉树 优先任务调度、TOP-k问题 树(Tree) 分层父子关系结构 二叉树、AVL树等 文件系统、数据库索引 图(Graph) 顶点与边构成关系网 邻接表、邻接矩阵 地图导航、社交关系网络 二、📊 数据结构逻辑组织层级关系 根据元素之间的逻辑关系,可分为线性与非线性结构: 🧩 线性结构 元素一对一排列 包括:线性表、栈、队列、串(字符串) 🌲 非线性结构 元素存在一对多或多对多关系 包括: 类型 示例 树 二叉树、搜索树、Huffman 树等 图 有向图、无向图、加权图等 ✅ 层级包含关系:图 ⊇ 树 ⊇ 二叉树 ⊇ 线性表 ...

2025-7-19 · 1 分钟 · Atom.X