数据结构
x.yao
既然选择了远方,便只顾风雨兼程.
展开
-
Map,Set知识点
一.了解搜索 1.概念及使用场景 Map和Set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。常见的搜索方式有: ①直接遍历:时间复杂度为O(N),元素如果多的话效率会很慢 ②二分查找:时间复杂度为O(log2N),前提是搜索前必须要求序列是有序的 上述查找方式比较适合静态类型的查找,即一般不会对区间进行插入和删除操作,而现实情况中的查找如:根据...原创 2020-06-01 17:07:52 · 102 阅读 · 0 评论 -
二叉树的前序,中序,后序遍历(非递归+递归)
一.遍历思路分析篇 1.了解树的结构:(思路都以下图树为例子)详情参照:二叉树基本概念 2.明白三种方法的遍历规则: 1>.前序遍历规则:根节点->左子树->右子树 如上图:根节点为1,所以遍历1,根节点遍历完去遍历根的左子树,左子树是以2为根的树,所以先遍历根2,再去遍历以2为根的左子树,遍历4,以4为根的左右子树都为空,返回再去遍历以2为根的右子树5,5...原创 2020-03-14 22:21:13 · 605 阅读 · 0 评论 -
如何用栈来模拟队列,如何用队列模拟栈??
首先要明白栈和队列两者之间的不同栈是一种先进后出的数据结构队列是一种先进先出的数据结构 分析完两者的结构特点之后再进行模拟 一.用栈模拟实现队列 用栈模拟队列,就要完成队列的一些基本操作:offer(x) – 将一个元素放入队列的尾部。poll() – 从队列首部移除元素。peek() – 返回队列首部的元素,但不删除。isEmpty() – 返回队列是否...原创 2020-02-22 14:23:16 · 2436 阅读 · 0 评论 -
List应用——模拟扑克牌(构造扑克牌及洗牌)
一.首先分析扑克牌,它的主要信息就是花色以及牌面值,所以可以写一个类来完成对扑克牌信息的封装。 二.对扑克牌信息封装好后就是对扑克牌进行一系列操作了,如创建一副牌以及洗牌操作等。 ①构造扑克牌:构造扑克牌其实很简单,一共有四个花色,每个花色有13张牌,所以两层for循环就可以,外层for循环用来循环四个花色,内层for循环就是1-13的牌面,每循环一次就将一张牌添加到Arra...原创 2020-02-19 14:17:57 · 627 阅读 · 0 评论 -
Java泛型的使用
一.泛型的引入 观察下列模拟实现顺序表的代码1:public class MyArrayList { private int[] array; // 保存顺序表的元素,即int类型的引用 private int size; // 保存顺序表内数据个数 public void add(int o) { //尾插代码...原创 2020-02-16 17:01:53 · 163 阅读 · 0 评论 -
循环队列:判断队列空和满的3种方法
一.少用一个存储位置 第一种情况:当队列为空时条件:rear == front当队列满时条件为:rear+1 == front 上述方式对于上述图是适用的,但如果出现了有下标标识,上述判断条件就不适用了。比如下图有下标了,当队列满时,显然条件就不能判断了,就要用到另一种判断。 第二种情况:当队列为空时条件:rear == front当队列满时条件为:(rear+1)...原创 2020-02-14 19:32:18 · 54627 阅读 · 10 评论 -
复杂链表的复制(深拷贝)
题目描述: 给定一个链表,每个结点包含一个额外增加的随机指针,该指针可以指向链表中任何结点或者空结点,要求返回这个链表的深拷贝。 思路分析: 1.破坏需要复制的复杂链表,将新老节点串成一个单链表的形式 2.解决random的指向问题(重要代码:cur.next.random=cur.random.next) 3.完成上述结点处理已经完成,最后一步就是将链表拆分开来...原创 2020-02-07 22:45:59 · 746 阅读 · 1 评论 -
八皇后问题(回溯法)
问题描述: 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。在8×8格的国际象棋棋盘上,安放八个皇后,要求没有一个皇后能够“吃掉”任何其他皇后,即任意两个皇后都不能处于同一行同一列或同一对角线上,这样的格局称为问题的一个解。请求出所有解。 数据结构: 二维数组 算法设计: 对于八皇后问题可以采用回溯法,从上至下依次在每一行放置皇后,进行搜索,若在某一行的任意...原创 2019-11-28 22:20:39 · 136 阅读 · 0 评论 -
狐狸逮兔子问题
问题描述: 围绕着山顶有10个圆形排列的洞,狐狸要吃兔子,兔子说:“可以,但是必须找到我,我就在这10个洞中,你先找到1号洞口,第二次隔1个洞找(即3号洞),第三次隔2个洞找(即6号洞),以此类推,次数不限。”但狐狸从早到晚进进出出了1000次,仍没有找到兔子。问兔子究竟藏在哪个洞里? 数据结构 顺序表实现 算法分析: 1.首先构造空的顺序表。因为有10个洞,所以可以...原创 2019-11-28 16:47:06 · 2733 阅读 · 0 评论 -
线性表应用(约瑟夫环问题)
问题描述: 设有n个人围坐在圆桌周围,现从某个位m(1<=m<=n)上的人开始报数,报数到k的人就站出来。下一个人,即原来的第k+1位置上的人又从1开始报数,再报数到k的人站出来。依此重复下去,直到全部的人都站出来为止。输出这个序列。 经典的使用循环链表问题 算法分析: 1.圆桌可以使用单循环链表来实现,出列就相当于在链表中删除元素。 2.首先程序需要两...原创 2019-11-27 17:42:41 · 1230 阅读 · 0 评论 -
二叉树的基本概念(定义,特性,存储结构等)
一.二叉树的定义 二叉树(Binary Tree)是n(n>=0)个数据元素的有限集合,该集合可以为空(空二叉树),也可以由一个称为根(root)的元素及两个不相交的,被分别称为左子树和右子树的二叉树组成 如上图中含有7个结点,其中A是根节点,左子树TL由{B,D,E}构成,右子树TR由{C,F,G}构成;而左子树TL中B是根结点,左子树是{D},右子树是{E};右子树...原创 2019-11-25 18:15:49 · 6901 阅读 · 0 评论 -
Java------判断单链表的回文结构
回文结构:如1-2-2-1;1-2-3-2-1;类似于这样的就是回文结构,可以发现链表正向和反向的内容顺序是一样的。 算法思路: ①可以先找到链表的中间节点,将后半部分进行反转 ②对反转后的链表进行前后部分数据域的比较,如果数据域相同,head=head.next;slow=slow.next,如果比较完之后两个指针相遇,则代表链表是回文结构(在这里要注意链表节点数是偶数个的情...原创 2019-11-12 20:08:32 · 296 阅读 · 0 评论 -
关于链表的清空(防止内存泄漏)
构建链表之后为什么要将链表清空? 链表是用指针把一个个存储的空间连接起来了,用完之后不清空,很容易发生内存泄漏(内存泄漏:向系统申请分配内存进行使用(new),可是使用完了以后却不delete,而自己出于某些原因不能再访问到那块内存(也许把它的地址给弄丢了),这时候系统也不能再次将它分配给需要的程序。)JVM内存回收 jvm内存结构分为五大区域:程序计数器、虚拟机栈、本地方法...原创 2019-11-11 20:30:30 · 3825 阅读 · 0 评论 -
双向链表相关代码(建立,插入,获取长度,打印)
双向链表 双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。双向链表节点图示:双向链表示意图: 要注意的是,在对双向链表进行操作时,如插入,删除,和单链表是有区别的,双向链表需要同时修改两个方向上的指针(prev和next)插入时指针的变化:参考代码...原创 2019-11-11 16:43:56 · 449 阅读 · 0 评论 -
Java-------相交链表
问题描述:找到两个单链表相交的起始节点如图所示:下图中即表示两个节点相交,两个链表在节点6处相交参考代码:class ListNode{ public int data; public ListNode next; public ListNode(int data){ this.data=data; this.next=null;...原创 2019-11-10 20:51:14 · 254 阅读 · 0 评论 -
Java-------反转单链表
问题描述: 给定一个单链表,将单链表进行反转。(即原单链表的头变为尾,尾变为头) 算法思路: ①可以定义cur用来遍历链表,pre指向cur的前驱节点,curnext指向cur的后继节点,newhead代表链表新的头。 ②当cur不为空时遍历,可以发现反转链表cur的next域就是原单链表的前驱节点地址,就是pre。所以将pre赋值给cur的指针域,pre等于cur,最后c...原创 2019-11-08 17:01:11 · 98 阅读 · 0 评论 -
Java-------删除单链表中重复的节点(前提是有序)
问题描述:在单链表有序的前提下,将单链表中重复出现的节点都删除 算法思路: ①定义cur用来遍历单链表的每个节点,定义一个虚拟节点node,定义一个tmp用来连接之后的节点 ②当cur不为空时进入循环,如果cur的下一个节点不为空,比较当前节点和下一个结点的数据域是否相等,如果相等cur走一步(因为遇到相等的数据,cur走一步相当于抛弃当前节点),之后再进行下一次的比较;如果...原创 2019-11-07 18:35:35 · 222 阅读 · 0 评论 -
Java---------判断一个单链表是否有环及找环的入口
什么是环? 单链表有环,是指单链表中某个节点的next指针域指向的是链表中在它之前的某一个节点,这样在链表的尾部形成一个环形结构。 如上图,最后一个节点指向了第三个节点,所以后面四个节点构成了一个环,怎么判断单链表是否有环呢? 一.快慢指针法判断有无环: 1.算法思路:可以定义快慢指针(fast和slow),让fast每次步径是slow的两倍,因为fast是两步两步...原创 2019-11-05 20:58:35 · 769 阅读 · 0 评论 -
Java--------对单链表进行排序(比x大的放在右边,比x小的放在左边,顺序不变)
问题描述:对一个单链表进行操作排序(比x大的放在右边,比x小的放在左边,顺序不变)参考代码:import java.util.List;//节点定义class ListNode{ public int data; public ListNode next; public ListNode(int data){ this.data=data; ...原创 2019-11-04 22:55:39 · 650 阅读 · 0 评论 -
Java-------合并两个有序链表
问题描述: 给定两个链表(前提是链表有序),将两个链表中的值由小到大进行合并 算法思路: ①首先给定两个单链表(有序),我们将第一个单链表的头用headA表示,第二个单链表的头用headB表示,其次还要定义一个虚拟节点node来表示新链表的头(数据域可给为-1),定义一个tmp来进行移动(tmp刚开始和node相等)。之后将一个一个经过比较的值往tmp后依此串就可以,再打印新连...原创 2019-11-02 23:30:05 · 473 阅读 · 2 评论 -
Java实现单链表的相关操作
Java具有封装的特性,所以我们可以根据这个特性将单链表分为3个类进行书写 ①第一个类就是节点类,定义了节点的数据域和next域,并且有一个带参构造来初始化节点 ②第二个就是定义一个链表类(下述为不带头结点的链表,单链表相关知识可以查看单链表:),链表类里有一个head属性,用来表示当前链表的头,初始化为空,不带头结点的链表当采用头插法时头是会变的哦 ③最后书写一个测试类来...原创 2019-10-29 21:00:57 · 117 阅读 · 0 评论 -
顺序表相关操作(增,删,改,查等)
我们用Java代码来实现顺序表 线性表的概念: 线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表,链表,栈,队列,字符串。 线性表的顺序存储结构是指在计算机中用一组地址连续的存储单元依次存储线性表的各个元素,元素之间的逻辑关系通过存储位置来反映,用这种存储形式存储的线性表称为顺序表。 顺序表:一般情况下采用数组存储。...原创 2019-10-28 22:51:09 · 440 阅读 · 0 评论 -
单链表的创建
单链表 线性表的顺序存储结构的特点是逻辑关系上相邻的两个元素在物理位置上也相邻,因此可以随机存取表中的任意一个元素。但在对顺序表进行插入,删除操作时需要对顺序表中的数据元素进行移位操作,降低了效率。链式存储结构就很好的解决了移位这个问题,它不需要一块连续的地址空间,因为他不要求逻辑结构上相邻的两个数物理结构上也要相邻,它是通过“链”的形式建立数据元素之间的逻辑关系,插入,删除元素时不需要进行移...原创 2019-10-16 15:26:25 · 5454 阅读 · 1 评论