大二学生，计算机科学与技术专业，学到数据结构和组原有点心态爆炸了，看不懂敲不出代码，还有救吗 ？
感觉就是代码敲得少了，多看，多敲，多思考，慢慢就练出来了。 看完下面的数据结构基础，再去LeetCode刷过200题就算入门了吧。 学计算机的课程之前，需要掌握好至少一门计算机语言，常见的语言选择有：Python，Java，C++. 选择C++的小伙伴怎么可以跟着这两门限时优惠的课程来学习： 学Python的小伙伴，跟着这门课来学，用游戏闯关的形式，学习python基础，有趣且高效。 下面咱们就来看看数据结构的主要内容吧。 尼克劳斯·维尔特，瑞士计算机科学家，在1976年写了一本名为《算法 + 数据结构 = 程序》的书。 40多年转瞬即逝，但这个公式依然成立。这也是今天我们程序员面试的时候，需要展示自己对数据结构以及他们应用场景的掌握的原因。 几乎所有的问题都需要面试者证明他们具有扎实的数据结构基本功。无论你是刚毕业也好（从大学还是编程培训营），还是有N多年的经验。 有时候这些面试题则是专门提到某种数据结构。比如，题目描述是这样开头的“给定一颗二叉树。。。”。其他的时候则是那种隐式的，比如说，“我们找到每个作者相关的书籍数目”。 学习数据结构是非常重要的，哪怕你只是想在当前的工作岗位上变得更赞一点。所以，就让我们从基础开始吧。 啥是数据结构？简单来说，数据结构就是一种容器，按照某种既定的方式存储数据。这种“方式”能让一个数据结构在某些操作下很高效，相反，在另外的操作下就不太理想了。你的目标是为了理解这些数据结构，从而可以能从不同的数据结构中选择适合当前所面对的问题的那一种。 为啥需要数据结构？因为数据结构是用来有规则地存储数据的，加上数据结构在计算机科学中神一般的存在，他们的价值就不言而喻了。 不过你要解决的问题是啥，你反正都得需要数据结构，方式可能不同而已。无论是面对员工工资，还是股票价格，购物清单，还是简单的电话本，这样的场景。 根据不同的应用场景，数据需要按照不同的方式存储。我们有好多可以将数据按照不同方式保存下来的数据结构。 常用的数据结构我们先来列一下最最常用的八种数据结构，然后接下来我们会慢慢将他们讲明白。 数组栈队列链表树图字母树（其实他们就是树而已，但还是值得单独拿出来讲的）哈希表 数组是最简单也最常用的数据结构。其他的数据结构诸如栈和队列，都是从数组衍生出来的。 下面是一个拥有四个元素的简单数组，包含了元素1，2，3，4.  每个元素都依附于一个正整数，称作索引，它就对应于数组中该元素所在的位置。大多数的编程语言中，数组的起始索引都为0 （0-based，译者注）. 数组一般有以下两种： 数组的基本操作 数组类常问问题 我们平时熟悉的软件操作中的撤销（回退）操作，基本会出现在所有应用中。你好奇过它是咋工作的吗？原理是这样的：你把之前的状态（有限的数量）都存到内存中，存的顺序是最新的操作存在最近一个。这个光靠数组是不能实现的。这是栈擅长的地方。 现实中也有栈的例子。比如你把一大堆书垂直叠（一本压着另外一本）起来放。为了拿到他们里面靠中部位置的书，你得把上面的书都拿走才行。这就是著名的LIFO（后进先出）的工作原理。 下图是一个包含有三个元素的栈，数值为1，2，3. 元素3在栈顶，它会被最先删除。 栈的基本操作 栈常见的面试问题 和栈类似，队列是另外一种线性数据结构。这种数据结构将元素按照顺序的方式存储。和栈最本质的区别就是：和后进先出相反，队列实现了先进先出的特性（FIFO， First in First Out）。 队列在生活中有非常贴切的例子：一堆人排在售票台前面。如果新来了一个人，这个人得排在队尾，而不是队伍前面。另一方面，排在第一的人则能第一个买到票，然后离开队伍。 下面是一个包含了四个元素的队列（1， 2， 3， 4）。1站在队头，会被第一个删除。 队列的常用操作 常见的队列题 链表是另外一种重要的线性数据结构。链表初看起来和数组很类似，但他们在内存分配，内部结构，以及像插入和删除这样的基本操作上，都是不一样的。 链表就是一串 串起来 的节点，他们的每一个节点都包含了数据和指向下一个节点的信息。链表有头结点，指向链表中的第一个元素。 链表结构经常用来实现文件系统，哈希表，以及邻接表。 下图是一个链表的内部结构图示。 我们常见的链表有以下两种：  链表基本操作：  常见的链表问题 图包含一系列的节点，这些节点通过网络相互连接起来。这些节点也被称为Vertcies。对于每个对子（x, y)，我们则称为边，表示节点x和节点y是相连的。边也可能包含权重或是花费信息，表明了从x到也所需要的消耗。 图的类型： 在计算机语言中，图通常用下面两种方法表示： 常用的图遍历算法： 常见的图问题 树是非线性数据结构，它也是由节点和边组成的。因此树和图类似，但他们最大的不同是树上没有环存在。 树被广泛应用在AI和其他复杂算法中，因为它能提供高效的存储，使得问题能得以解决。 下面是一颗简单树，图中也包含了常见的树的术语。 我们可以有以下的各种树的形状： 上面这些树中，以二叉树和二叉搜索树最为常用。 常见的树的问题 字母树，也叫做前缀树，是一种树形的数据结构，它是一种解决字符串相关的问题的高效数据结构。能快速查询回馈信息，经常用在字典中查询单词的场景下，它能为搜索引擎提供自动补全，甚至能帮到IP查询。 下图演示了如何将三个单词（top, thus, their）插入到字母树中，并保存下来： 在字母树中，单词都是从下至下一个字母一个字母保存起来的。绿色的节点（p, s, r）表示的是该节点是一个单词的最后一个字母，p对应top，s对应thus，而r则对应于their。 常见的字母树问题： 哈希是一个分辨不同的实体，从而将每个实体存储在某个预先计算好的索引上，这个预先算出来的值被称作“键”。因此，实体都是由键值对的形式存放的，把一大堆这样的东西称为字典。每个实体都能通过键来找到。基于哈希这种思想的数据结构有不少，但最常用的是哈希表。 哈希表一般通过数组来实现。 哈希表的效率取决于以下三个因数： 下面这图演示了我们是怎么从哈希值匹配到一个数组中的。该数组的索引是通过函数函数求出来的。 常见问题：  上面就是八种你在算法面试之前必知必会的数据结构。 具体的学习，可以参考原文作者开发educative上的数据结构课程： 专门针对数据结构的课程则有： C++: JavaScript： Java： Python： 我上过其中的Java版本，课程是把数据结构里面的基础数据结构都用java实现了一遍，对于用java的同学特别有帮助，java的基础在刷题的过程中，还是要必须掌握的。  计算机的其他核心课程，参考这个回答： 