
数据结构
_Nanfeng
人生只有900个月,趁年轻,在自己的世界里做自己的英雄。
展开
-
数据结构之顺序表
什么是线性表线性表就是n个具有相同特性的数据元素的有限序列。它在逻辑上是线性结构,在物理结构上却不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。常见的线性表有:顺序表、链表、栈、队列、字符串等。首先我来介绍顺序表。顺序表所谓顺序表,就是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在实现顺序表之前,我们先定义一个接口IArrayL...原创 2019-05-09 10:10:28 · 670 阅读 · 2 评论 -
栈和队列常考笔试题(一)
1、给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。有效字符串需满足:1、左括号必须用相同类型的右括号闭合。2、左括号必须以正确的顺序闭合。注意空字符串可被认为是有效字符串。思路:我们可以使用栈来判断字符串是否有效。先定义一个栈,从所输入的第一个字符串开始判断,如果遇到左括号,全部入栈,而如果遇到了右括号,首先判断当前栈是否为空。如...原创 2019-06-05 00:36:35 · 568 阅读 · 0 评论 -
二叉树笔试题(二)
1、采用前序遍历的方式,将一个二叉树转换成一个由括号和整数组成的字符串。空节点则用一对空括号 "()" 表示。省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。示例:思路:如果根节点不为空的话,在字符串后边先打印一个左括号,然后再打印根节点的值。如果左子树为空,而右子树不为空,像示例2的那样,就必须打印一对括号出来,不可以省略(如果左右子树都为空,可以省略括号)。其余情...原创 2019-06-10 21:30:12 · 1044 阅读 · 0 评论 -
栈和队列常考笔试题(二)
1、使用队列实现栈的下列操作push(x) – 元素 x 入栈pop() – 移除栈顶元素top() – 获取栈顶元素empty() – 返回栈是否为空思路:先创建一个队列,用队列实现入栈操作很简单,直接在队列的末尾增加元素就可以:pop操作移除栈顶元素相对来说比较复杂,在上面那个示例中,栈顶元素是5,在最右边,而出队列又只能在最左边进行,要移除5这个元素,我们首先得把前面的4...原创 2019-06-10 18:16:54 · 399 阅读 · 0 评论 -
数据结构之栈和队列
栈1、栈的概念和结构栈: 是一种特殊的线性表,只允许在固定的一端进行插入和删除操作。栈中的数据遵循先进后出(FILO)原则。注意:数据的出入都是在栈顶进行操作。进栈:出栈:2、栈的实现栈的实现一般可以使用数组或者链表来实现,数组用的更多一些,因为数组的尾插代价比较小,相对来说更容易。用数组来实现一个栈:尾插: 栈的尾插就是将要插入的数据放到数组的末尾,然后将数组内元素的个数加...原创 2019-06-04 13:39:24 · 328 阅读 · 0 评论 -
常考链表笔试题(五)
1、普通链表的拷贝。思路:普通链表的拷贝比较简单,定义一个结果链表和一个last引用(指向结果链表的最后一个节点),再定义一个cur引用,指向当前链表的第一个节点。遍历原链表,根据原链表的第一个节点创建一个新的节点出来,作为结果链表的第一个节点,然后尾插到结果链表中,尾插分两种情况,结果链表为空和不为空,尾插在之前的笔试题中已用到多次,这里就不在详细说明。直接看代码:public Lis...原创 2019-06-04 01:11:23 · 221 阅读 · 0 评论 -
非递归实现二叉树的遍历
前序遍历思路:原创 2019-06-10 01:40:13 · 510 阅读 · 0 评论 -
常考链表笔试题(四)
1、给定一个链表,判断链表中是否有环。示例:思路:这道题还是利用快慢引用的思路,快的走一步,如果不为空,快的再走一步,慢的走一步,如果快引用的指向为空,说明无环,而如果快引用和慢引用的指向相等,说明有环。具体代码如下:public boolean hasCycle(ListNode head){ if (head==null){ ...原创 2019-06-03 02:13:11 · 272 阅读 · 0 评论 -
常考链表笔试题(三)
1、判断是否是回文思路:判断一个链表是否是回文结构,我们可以先找到这个链表的中间节点middle,然后将middle节点之后的链表进行反转,得到一个新链表。再定义两个引用,分别指向原链表和新链表的第一个节点,然后遍历链表,从第一个结点开始比较,如果两个引用的值不一样,那么就不是回文。图解过程如下:所以我们现在要解决两个问题:1)找到链表的中间结点这个很简单,遍历链表,求出它的长度,...原创 2019-06-03 01:40:16 · 243 阅读 · 0 评论 -
常考链表笔试题(二)
1、链表的分割:以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前思路:定义两条链表,一个用来保存所有比给定值小的节点,记为链表small,另一个用来保存所有比给定值大的节点,记为链表big。遍历整个链表,cur指向当前链表的头节点,如果cur的值小于给定值,就把它尾插到small节点中,...原创 2019-06-02 23:34:38 · 197 阅读 · 0 评论 -
常考链表笔试题(一)
1、删除链表中等于给定值 val 的所有节点。示例:输入: 1->2->6->3->4->5->6, val = 6输出: 1->2->3->4->5思路:要删除链表中等于给定值的所有节点,我们可以定义一个结果链表,再结合尾插的方法来实现。定义一个last引用,指向结果链表的最后一个节点,cur引用指向给定链表的第一个节点。遍...原创 2019-06-02 17:40:35 · 1098 阅读 · 0 评论 -
根据中序遍历和后序遍历构造二叉树
根据一棵树的中序遍历与后序遍历构造二叉树。思路:根据后序遍历,先找到这棵树的根节点的值,也就是数组中最后一个节点(数组长度-1)的位置,由此创建根节点。然后在中序遍历中找到根的值所在的下标,切出左右子树的前序和中序。注意:如果后序遍历的数组长度为0,说明是一棵空树。下面用具体的例子来说明:中序:CDBAE后序:DCBEA1、由后序遍历可以确定A是这棵树的根节点,然后根据中序遍历...原创 2019-06-06 22:11:24 · 23430 阅读 · 2 评论 -
根据前序遍历与中序遍历构造二叉树
根据一棵树的前序遍历与中序遍历构造二叉树。思路:有了前序遍历,首先我们可以知道根节点的值,也就是数组中下标为0的位置,由此创建根节点。然后在中序遍历中找到根的值所在的下标,切出左右子树的前序和中序。注意:如果前序遍历的数组长度为0,说明是一棵空树。下面用具体的例子来说明:前序:ABCDE中序:CDBAE1、首先可以确定A是这棵树的根节点,然后根据中序遍历切出A的左右子树,得到B...原创 2019-06-06 21:40:40 · 16097 阅读 · 4 评论 -
用带空节点的前序遍历构造二叉树
1、编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(用带空节点的前序遍历创建二叉树)。思路:根据前序遍历,很容易就能找到根节点的值(字符串中下标为0的位置)。但是目前还是无法区分剩下的字符串中,哪些属于左子树,哪些属于右子树。为了解决这个问题,我们可以在创建树的过程中记录一下所用节点的个数,这样除去根节点和左子树用的节点个数,剩下的就属于右子树。但是又会出现一个...原创 2019-06-06 16:53:06 · 5032 阅读 · 0 评论 -
二叉树笔试题(一)
1、二叉树的前序遍历、中序遍历、后序遍历思路:在二叉树那篇文章里已经介绍过,这里直接看代码:private ArrayList<Integer> list; //1、前序 private void preorder(TreeNode root) { if (root != null) { list.add(root.val...原创 2019-06-06 13:41:51 · 1144 阅读 · 3 评论 -
堆的向上向下调整算法
1、已知关键字序列5,8,12,19,28,20,15,22是最小堆,插入关键字3,求调整后得到的最小堆建堆:插入关键字3:从3开始向上调整,让它满足最小堆的特点,过程如下:3和19交换位置3和8交换位置:3和5交换位置至此交换完毕,满足最小堆的特点,调整后得到的最小堆为3,5,12,8,28,20,15,22,19。2、已知小根堆为8,15,10,21,34,16,12...原创 2019-06-06 01:24:22 · 3564 阅读 · 0 评论 -
数据结构之二叉树
树在介绍二叉树之前,先说一下树的结构和几个容易混淆的小知识点。树的结构:怎么判断它是不是一棵树呢?1)子树不相交2)除了根节点以外,每个节点有且仅有一个父节点3)一棵N个节点的树有N-1条边关于树里边节点、父节点、兄弟节点、孩子等概念不多叙述,注意以下几个概念:1)节点的度:一个节点含有子树的个数称为该节点的度,如:A的度为62)叶子节点:度为0的节点,如B,C,H等3)树的...原创 2019-06-06 00:23:01 · 774 阅读 · 0 评论 -
数据结构之链表
上一篇文章里我介绍了顺序表的实现,这一篇我将介绍链表的实现。链表概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的引用链接次序实现的。实际中链表的结构非常多,比如说:1、单向、双向2、带头、不带头3、循环、非循环以上各种组合起来又是很多种链表的结构,但是最常用的还是以下三种:1、无头单向非循环链表2、带头循环单链表3、不带头双向循环链表...原创 2019-05-12 00:19:44 · 13623 阅读 · 0 评论 -
常见排序算法的实现
直接插入排序希尔排序直接选择排序堆排序冒泡排序快速排序归并排序原创 2019-07-18 08:23:14 · 372 阅读 · 0 评论