先弄清这门课补的是哪块短板

数据结构这门课,最容易出现的情况是「听过、写过、但一换题就卡住」。数组、链表、栈、队列、二叉树、图,这些名词在软考上午题里认得,在下午的设计题里却未必推得动;笔试能画出哈希表冲突链,真让你手写一个带扩容的散列表又容易在边界条件上翻车。这份《玩转数据结构视频教程》要解决的就是这种「知道却做不对」的状态。

它更适合三类人:正在准备软考中级(软件设计师、数据库系统工程师等)的考生,需要把数据结构从「背结论」切换到「会推导」;从别的方向转到 Java 后端、被面试问到算法题就想跳过的人;以及工作几年、日常 CRUD 写得多、但一遇到性能瓶颈说不清该换哪种结构的人。

课程围绕哪些结构展开

内容是沿着「线性结构 → 树形结构 → 散列与图」这条主线走的,每个结构基本都拆成三件事:它长什么样、它为什么这样设计、它在代码里怎么落地。线性部分会讲到顺序表与链表的取舍,以及栈和队列在表达式求值、递归模拟、广度优先搜索里的实际用法;树这一块会覆盖二叉树的遍历(前中后序、层序)、二叉搜索树、堆与优先队列,并延伸到平衡树的调整思路;再往后是散列表的冲突处理与扩容,以及图的存储和两种遍历。

和只看结论的复习资料不同,这里会带着你算复杂度。比如同样是查找,顺序表、链表、二叉搜索树、散列表各自在最好、最坏、平均情况下是什么量级,为什么哈希表平均 O(1) 却可能退化。软考下午题里那种「给定序列画出构造过程」的题,靠的就是这种一步步推的能力,而不是背答案。

配套练习和笔记怎么用

每章配有章节笔记,作用是课后快速回看,尤其是考前一周不想重看视频的时候,笔记能帮你把定义、性质、典型操作的时间复杂度重新过一遍。练习部分不要只看着答案点头,建议按这个节奏走:先看完一节,合上视频自己把核心操作手写一遍(比如插入、删除、旋转),再对照课程检查漏掉的边界;每完成两到三节,用自己的话整理一份小结,重点写「这个结构适合解决什么问题、不适合什么」。

如果你时间紧,可以优先保证栈与队列、二叉树遍历、排序算法的稳定性与复杂度、哈希冲突处理这几块,它们在软考和面试里出现频率最高。图论部分如果暂时用不上,至少把邻接矩阵与邻接表的区别、DFS 与 BFS 的适用场景弄清楚。

看完应该能回答这些问题

  • 给定一组插入和删除操作,能否手推出二叉搜索树的形态变化,并判断它是否退化成链表?
  • 冒泡、插入、选择、快排、归并、堆排序,各自的时间复杂度、空间复杂度和稳定性,能不能不看资料说清楚?
  • 哈希表发生冲突时,开放地址法和链地址法分别怎么做,装载因子为什么会影响性能?
  • 面对一道题,先判断它该用栈、队列还是树来解决,理由是什么?
  • 软考下午题里要求写出算法思路或补全代码的题,能不能独立写出关键步骤而不是靠印象?

如果上面有几道答不上来,说明缺口就在那里,按顺序补即可;如果大部分能顺畅回答,可以直接跳到树和图的章节做拔高练习。


image.webp 下载附件   保存到相册 2025-6-18 00:03 上传

课程推荐

《玩转数据结构视频教程》image.webp 下载附件   保存到相册 2025-6-18 00:03 上传【技能收获】学完可掌握:Java 后端开发。课程以实战为导向,覆盖从基础概念到完整项目落地的关键步骤,配套章节笔记便于课后复盘与面试前快速回顾。【学习建议】建议按目录顺序学习,先打基础再进入综合实战章节;每完成 2~3 节可结合笔记整理一份学习小结,最终尝试独立复现一套完整 Demo 写入个人作品集。【就业发展】可面向岗位:Linux 运维工程师、SRE、云计算工程师、DevOps 工程师。云原生与自动化运维仍是企业 IT 刚需方向,认证 + 实战项目组合能显著提升面试通过率,适合向中高级运维或架构岗进阶。 若你已有一定编程或运维基础,本课程可帮助你在现有技能栈上快速叠加热门方向能力,提升求职时的项目说服力与薪资谈判空间。

视频目录(113 节)

*   1-1 欢迎学习《玩转数据结构》  (2049).mp4

*   1-2 学习数据结构(和算法)到底有没有用?  (0817).mp4

*   1-3 关于课程学习的更多注意事项  (1410).mp4

*   1-4  课程编程环境搭建  (0757).mp4

*   2-1 使用Java中的数组  (1234).mp4

*   2-2 二次封装属于我们自己的数组  (1545).mp4

*   2-3 向数组中添加元素  (1230).mp4

*   2-4 数组中查询元素和修改元素  (1008).mp4

*   2-5 包含,搜索和删除  (1605).mp4

*   2-6 使用泛型  (1631).mp4

*   2-7 动态数组  (1501).mp4

*   2-8 简单的复杂度分析  (2037).mp4

*   2-9 均摊复杂度和防止复杂度的震荡  (1450).mp4

*   3-1 栈和栈的应用:撤销操作和系统栈  (1159).mp4

*   3-2 栈的基本实现  (1601).mp4

*   3-3 栈的另一个应用:括号匹配  (1552).mp4

*   3-4 关于Leetcode的更多说明  (1733).mp4

*   3-5 数组队列  (1453).mp4

*   3-6 循环队列  (1523).mp4

*   3-7 循环队列的实现  (1723).mp4

*   3-8 数组队列和循环队列的比较  (1249).mp4

*   4-1 什么是链表  (1336).mp4

*   4-2 在链表中添加元素  (1758).mp4

*   4-3 使用链表的虚拟头结点  (0715).mp4

*   4-4 链表的遍历,查询和修改  (1106).mp4

*   4-5 从链表中删除元素  (1520).mp4

*   4-6 使用链表实现栈  (1144).mp4

*   4-7 带有尾指针的链表:使用链表实现队列  (1922).mp4

*   5-1 Leetcode中和链表相关的问题  (1557).mp4

*   5-2 测试自己的Leetcode链表代码  (0833).mp4

*   5-3 递归基础与递归的宏观语意  (1706).mp4

*   5-4 链表的天然递归结构性质  (1258).mp4

*   5-5 递归运行的机制:递归的微观解读  (2144).mp4

*   5-6 递归算法的调试  (1503).mp4

*   5-7 更多和链表相关的问题  (1253).mp4

*   6-1 为什么要研究树结构  (0916).mp4

*   6-2 二分搜索树基础  (1900).mp4

*   6-3 向二分搜索树中添加元素  (1601).mp4

*   6-4 改进添加操作:深入理解递归终止条件  (1008).mp4

*   6-5 二分搜索树的查询操作  (0526).mp4

*   6-6 二分搜索树的前序遍历  (1818).mp4

*   6-7 二分搜索树的中序遍历和后序遍历  (1008).mp4

*   6-8 深入理解二分搜索树的前中后序遍历  (1136).mp4

*   6-9 二分搜索树前序遍历的非递归实现  (1543).mp4

*   6-10 二分搜索树的层序遍历  (1338).mp4

*   6-11 删除二分搜索树的最大元素和最小元素  (2222).mp4

*   6-12 删除二分搜索树的任意元素  (1714).mp4

*   6-13 更多二分搜索树相关话题  (0927).mp4

*   7-1 **基础和基于二分搜索树的**实现  (1923).mp4

*   7-2 基于链表的**实现  (0817).mp4

*   7-3 **类的复杂度分析  (1953).mp4

*   7-4 _Leetcode中的**问题和更多**相关问题  (1253).mp4

*   7-5 映射基础  (1211).mp4

*   7-6 基于链表的映射实现  (1859).mp4

*   7-7 基于二分搜索树的映射实现  (1503).mp4

*   7-8 映射的复杂度分析和更多映射相关问题  (1202).mp4

*   7-9 Leetcode上更多**和映射的问题  (1713).mp4

*   8-1 什么是优先队列  (1520).mp4

*   8-2 堆的基础表示  (1850).mp4

*   8-3 向堆中添加元素和Sift Up  (1021).mp4

*   8-4 从堆中取出元素和Sift Down  (1708).mp4

*   8-5 Heapify 和 Replace  (2046).mp4

*   8-6 基于堆的优先队列  (0617).mp4

*   8-7 Leetcode上优先队列相关问题  (1844).mp4

*   8-8 Java中的PriorityQueue  (1509).mp4

*   8-9 和堆相关的更多话题和广义队列  (0956).mp4

*   9-1 什么是线段树  (1334).mp4

*   9-2 线段树基础表示  (1815).mp4

*   9-3 创建线段树  (1822).mp4

*   9-4 线段树中的区间查询  (1623).mp4

*   9-5 Leetcode上线段树相关的问题  (1710).mp4

*   9-6 线段树中的更新操作  (1228).mp4

*   9-7 更多线段树相关的话题  (1641).mp4

*   10-1 什么是Trie字典树  (1334).mp4

*   10-2 Trie字典树基础  (1426).mp4

*   10-3  Trie字典树的查询  (1316).mp4

*   10-4 Trie字典树的前缀查询  (0714).mp4

*   10-5 Trie字典树和简单的模式匹配  (1227).mp4

*   10-6 Trie字典树和字符串映射  (1609).mp4

*   10-7 更多和Trie字典树相关的话题  (1600).mp4

*   11-1 什么是并查集  (1322).mp4

*   11-2 Quick Find  (1448).mp4

*   11-3 Quick Union  (1512).mp4

*   11-4 基于size的优化  (1924).mp4

*   11-5 基于rank的优化  (1047).mp4

*   11-6 路径压缩  (1154).mp4

*   11-7 更多和并查集相关的话题  (1405).mp4

*   12-1 平衡树和AVL  (1457).mp4

*   12-2 计算节点的高度和平衡因子  (1215).mp4

*   12-3  检查二分搜索树性质和平衡性  (0952).mp4

*   12-4 旋转操作的基本原理  (2004).mp4

*   12-5 左旋转和右旋转的实现  (1328).mp4

*   12-6 LR 和 RL  (1858).mp4

*   12-7 从AVL树中删除元素  (1859).mp4

*   12-8  基于AVL树的**和映射  (1525).mp4

*   13-1 红黑树与2-3树  (1309).mp4

*   13-2 2-3树的绝对平衡性  (1903).mp4

*   13-3 红黑树与2-3树的等价性  (1940).mp4

*   13-4 红黑树的基本性质和复杂度分析  (1913).mp4

*   13-5 保持根节点为黑色和左旋转  (1917).mp4

*   13-6 颜色翻转和右旋转  (1543).mp4

*   13-7 红黑树中添加新元素  (1456).mp4

*   13-8 红黑树的性能测试  (1521).mp4

*   13-9 更多和红黑树相关的话题  (0930).mp4

*   14-1 哈希表基础  (1954).mp4

*   14-2 哈希函数的设计  (2524).mp4

*   14-3 Java中的 hashCode 方法  (2138).mp4

*   14-4 链地址法 Separate Chaining  (1133).mp4

*   14-5 实现属于我们自己的哈希表  (1852).mp4

*   14-6 哈希表的动态空间处理与复杂度分析。  (1754).mp4

*   14-7 哈希表更复杂的动态空间处理方法  (2030).mp4

*   14-8 更多哈希冲突的处理方法  (0945).mp4

*   15-1 更广阔的数据结构的世界,大家加油!  (1523).mp4