数据结构
小马哥~
这个作者很懒,什么都没留下…
展开
-
如何用链表实现队列?
定义队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。代码实现建立在这篇文章的基础上链表的实现class LinkListQueue extends LinkList { public $tail; //尾结点 /** * @param mixed $val * @return */原创 2020-05-23 17:04:21 · 265 阅读 · 0 评论 -
如何用链表实现栈?
定义栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。代码实现建立在这篇文章的基础上链表的实现public function push($val){ $this->addFirst($val);}public fu原创 2020-05-23 15:54:34 · 1017 阅读 · 0 评论 -
如何查找链表的倒数第K个结点
解题思路1:链表的长度为size 循环size -k次2:原地反转,循环k次3:双指针,让A指针先走k步。然后A、B再同时开始走,当A到结尾时,此时B所处的位置就是k结点边界条件1:链表为空2:k<= 03:k >= size代表实现建立在这两篇博客的基础上链表的实现链表反转public function getLastNodeBySize($k) { if(!$this->commonCheck($k)){ return null;原创 2020-05-22 20:22:55 · 339 阅读 · 0 评论 -
如何获得链表的中间节点?
解题思路1:双指针法:开始时都指向头节点,一个步长为2,另一个步长为1。经过n次循环后,步长为2的的指针到达尾部时,步长为1的指针所处的位置正好是中间节点2:循环 sum/2 次边界条件链表为空代码实现建立在这篇博客的基础上如何实现链表public function getInterNodeByDoublePointer() { $slow = $this->head->next; if($slow == null) { return "";原创 2020-05-19 13:15:30 · 335 阅读 · 0 评论 -
如何将两个有序链表合并成一个链表
解题思路具体思想就是新建一个链表,然后比较两个链表中的元素值,把较小的那个链到新链表中,由于两个输入链表的长度可能不同,所以最终会有一个链表先完成插入所有元素,则直接将另一个未完成的链表直接链入新链表的末尾。实现方案1:递归算法(代码也容易理解,但是它的弊端也很明显时间空间开销都很大,效率低)2:非递归算法边界条件1:两个链表都为空2:有一个链表为空代码实现建立在这篇博客的基础上如何实现链表递归算法function mergeByRecursion($node1, $node2){原创 2020-05-17 17:48:28 · 2935 阅读 · 0 评论 -
统计链表结点的长度的2种方式
解题思路1:可以加一个占位 size变量 然后后边增删都维护这个占位,复杂度O(1)。2:遍历链表,来获取长度,复杂度O(n)。代码实现建立在这篇博客的基础上如何实现链表 public function getLinkListSize() { return $this->size; }...原创 2020-05-17 12:00:40 · 733 阅读 · 0 评论 -
链表常用操作大集合
前言主要是做一个汇总,方便自己和有需要的人查看。一个一个搜比较费劲。目录如何实现链表如何知道链表是否有环链表如何反转判断两个链表是否相交并找出相交点如何从尾部打印链表持续更新!!!...原创 2020-05-17 11:27:40 · 242 阅读 · 0 评论 -
链表如何从尾部开始打印?
解题思路遍历+栈边界条件1:链表为空2:链表只有一个元素代码实现建立在这篇博客的基础上如何实现单链表public function tailPrint(){ $prev = $this->head->next; if($prev == null){ echo "链表为空"."\n"; return; } //如果只有一个元素 直接打印返回就好了 if($prev->next == null){原创 2020-05-17 11:17:13 · 316 阅读 · 1 评论 -
如何判断两个链表是否相交并找出交点
解题思路情况1:两个链表均不含有环1、直接法采用暴力的方法,遍历两个链表,判断第一个链表的每个结点是否在第二个链表中,时间复杂度为O(len1*len2),耗时很大。2、hash计数法如 果 两个链表相交,则两个链表就会有共同的结点;而结点地址又是结点唯一标识。因而判断两个链表中是否存在地址一致的节点,就可以知道是否相交了。可以对第一 个链表的节点地址进行hash排序,建立hash表,然后针对第二个链表的每个节点的地址查询hash表,如果它在hash表中出现,则说明两个链表有共 同的结点。这个方法原创 2020-05-16 23:02:07 · 6465 阅读 · 0 评论 -
实现链表反转的2种方法
解题思路1:头节点插入法创建一个新的链表,然后循环旧链表并使用头插法插入数据到新的链表,完成后便是一个反转的链表2:原地反转头结点插入法的实质是重新创建了一个新的链表,通过遍历待反转链表,将链表每一个节点插入到创建的链表中,然后的到的这个创建的链表就是反转后的链表。而就地反转实质就是在待反转链表基础上修改节点顺序得到反转链表。边界条件1:链表为空2:链表只有一个元素代码实现建立在这篇博客的基础上php实现链表$tmpLinkList = new LinkList(); //头插法反原创 2020-05-16 15:08:23 · 3981 阅读 · 0 评论 -
如何知道链表是否有环?
解题思路1:遍历链表,把元素存在map中,如果map中存在该元素,说明有环2:通过快慢指针,每个指针每次不一样的跨度,如果在某一时刻,两个指针相遇,说明有环边界条件链表是否为空代码实现建立在这篇代码的基础上php实现链表#新增一个全局变量public $map; //用来判断链表是否有环#新增3个方法#方式1public function isLoopLinkListByDoublePointer() { $slow = $this->head->next;原创 2020-05-18 20:52:51 · 272 阅读 · 0 评论 -
如何实现链表?
定义链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。相比于线性表顺序结构操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O原创 2020-05-13 20:02:48 · 1076 阅读 · 0 评论 -
数据结构之线性表顺序存储
通过本篇博客你会了解到的内容线性表的定义零个或多个数据元素的有限序列。这里需要强调几个关键的地方1:首先它是一个序列。也就是说,元素之间是有顺序的,若元素存在多个,则第一个元素无前驱,最后一个元素无后继,其他每个元素都有一个前驱和后继。2:然后,线性表强调是有限的。如果用数学语言来进行定义。可如下:若将线性表标记为(a1,…ai-1,ai,…,ai+1,…an),则表中ai-1领先于...原创 2020-03-02 20:25:05 · 305 阅读 · 0 评论 -
遍历二叉树
二叉树遍历概念二叉树遍历是指从根结点出发,按照某种次序依次访问二叉树中的所有结点,使得每个结点被访问一次且仅被访问一次。二叉树遍历方法遍历方法分为:前序遍历,中序遍历,后序遍历,层序遍历前序遍历规则是若是二叉树为空,则空操作返回,否则先访问根结点,然后前序遍历左子树,再前序遍历右子树。如下图所示 遍历顺序为:ABDGHCEIF中序遍历规则是若树为空,则空操作返回,否则从根结点开始(...原创 2019-11-02 17:24:11 · 130 阅读 · 0 评论 -
数据结构概念篇
基本概念和术语数据:是描述客观事物的符号,是计算机中科可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合。数据元素:是组成数据的、有一定意义的基本单位,在计算机中通常作为整理处理。也被称为记录。数据项:一个数据元素可以由若干个数据项组成。数据对象:是性质相同的数据元素的集合,是数据的子集。数据结构:是相互之间存在一种或多种特定关系的数据元素的集合。逻辑结构与物理结构逻辑结...原创 2020-03-01 15:58:31 · 275 阅读 · 0 评论 -
数据结构之队列
队列:只允许在一端进行插入操作,另一端进行删除操作的线性表特性:先进先出应用场景:打字,鼠标点击后电脑的处理复杂度:0(1)队列分为顺序队列(优化后是循环队列,复杂度从o(n)变为o(1))和链队列优缺点:建议可以看下我的前几篇文章,了解下链式存储和顺序存储,这2个了解了,就清楚优缺点是什么了。何时用顺序队列:如果队长确定何时用链队:队长不确定,一会变长,一会变短根据公式推断顺序队...原创 2019-04-24 19:40:43 · 129 阅读 · 0 评论 -
数据结构之栈
栈:只允许在表尾进行插入和删除操作的线性表特性:后进先出应用场景:浏览器的后退,递归,四则运算表达式求值,word,ps的撤销操作复杂度:0(1)插入数据称为:入栈,压栈,进栈删除数据称为:出栈,弹栈栈分为顺栈和链栈,下面是优缺点顺栈优点:存取时定位方便缺点:会造成空间浪费链栈优点:不需要分配空间,栈长没有限制缺点:指针需要占用额外的空间何时用顺栈:如果栈长确定...原创 2019-04-23 20:12:06 · 123 阅读 · 0 评论 -
数据结构之线性结构
上一章进行了简单介绍,这一章进入正题,来说下线性结构线性结构:0个或多个数据的有限序列顺序存储结构1:顺序存储结构链式存储结构1:单链表2:静态链表3:循环链表4:双向链表顺序存储结构概述:数据存储在地址连续的存储单元,物理关系即是逻辑关系,无需为表达逻辑关系占用更多的空间。优点:可以任意存取,复杂度都是0(1)缺点:插入和删除需要移动大量元素,复杂度为0(n),当数...原创 2019-04-22 20:14:17 · 203 阅读 · 0 评论