数据结构
文章平均质量分 67
蚍蜉撼树谈何易
愿你有理想可奔赴,亦有青春可回顾。
展开
-
二叉树算法-初阶
二叉树初阶问题二叉树的构建/遍历问题判断是否为平衡二叉树子树的判定对称二叉树判断两个树是否相同二叉树的反转二叉树的最大深度单值二叉树二叉树的构建/遍历问题二叉树的定义问题typedef char datatype;struct Binarytree{ datatype val; struct Binarytree *left;//存储的是左孩子结点 struct Binarytree*right;//存储的是右孩子结点};二叉树的构建struct Binarytre原创 2021-06-11 14:50:53 · 154 阅读 · 2 评论 -
快速入手八大排序,带你从入门到精通
八大排序冒泡排序选择排序直接插入排序希尔排序(缩小增量的排序)堆排计数排序快排快排的递归做法递归做法----hoare方法递归做法------挖坑法递归做法-----快慢指针方法快排非递归写法快排非递归方法---hoare方法。快排非递归方法---挖坑法快排非递归--快慢指针做法快排的优化取中间值法利用插入排序来优化快排快排的时间复杂度与空间复杂度及应用场景归并排序递归下的归并算法冒泡排序冒泡排序定义:冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个原创 2021-06-05 11:54:06 · 998 阅读 · 39 评论 -
数据结构之二叉树详解
二叉树的基本概念及遍历方法树的定义树的结构特点二叉树基本概念二叉树性质二叉树的遍历二叉树的递归遍历及经典用例树的定义由一个或多个(n≥0)结点组成的有限集合T,有且仅有一个结点称为根(root),当n>1时,其余的结点分为m(m≥0)个互不相交的有限集合T1,T2,…,Tm。每个集合本身又是棵树,被称作这个根的子树 。树的结构特点非线性结构,有一个直接前驱,但可能有多个直接后继(1:n)树的定义具有递归性,树中还有树。树可以为空,即节点个数为0。若干术语根 à 即根结点(没有前驱)叶原创 2021-05-28 17:52:16 · 349 阅读 · 17 评论 -
栈帧,堆/栈,堆的函数使用,堆排序
区分一下堆栈,同时给出堆的实现堆/栈,栈帧,栈和队列区别堆什么是堆?堆的实现--利用结构体来实现堆堆排序堆/栈,栈帧,栈和队列区别堆/栈:虚拟进程地址空间分段的一块内存区域的划分。指的是一块特殊的内存空间,该内存空间中保存的都是与函数调用的相关的一些信息。该空间设计的时候与数据结构中栈的特性一致。栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。简言之,栈帧就是利用EBP(帧指针)寄存器访问局部变量、参数、函数返回地址手段每块独立的栈帧一般包括(1.函数的返回地址和参数)(2.临时变原创 2021-05-24 20:18:54 · 522 阅读 · 10 评论 -
栈和队列的基本概念及操作
栈的基本概念及相应操作一、栈的定义及使用栈的定义特性栈的应用场景一、栈的定义及使用栈的定义特性栈的应用场景一、栈的定义及使用原创 2021-05-22 09:43:27 · 581 阅读 · 8 评论 -
带头结点的双向循环链表及相应的操作
双向循环链表与单链表的区别:1.单链表中仅含有一个指针域,便是next(后继元素)指针域。而双向循环链表中有两个指针域,一个指向前驱(pre),一个指向后继(next)。2.单链表是以指针走到NULL值作为链表遍历结束条件的,双向循环链表是以从head->next开始访问,直到该指针重新指向head时,循环结束。3.单链表在删除和插入时只可在传入位置的下一个位置进行执行插入与删除,因为其没有前驱结点,所以不可对传入的结点进行头插(传入结点之前),或者是当前位置元素删除。但双向循环链表可以这样做,原创 2021-05-19 19:07:29 · 1154 阅读 · 4 评论 -
链表相关面试题:返回一个链表的深度拷贝,对链表进行插入排序,删除链表中重复的结点
一、返回一个链表的深度拷贝。题目描述:解题思路:1.首先将原链表的每个结点在后面都生成它的一个复制版本,同时将这些新结点依次连接到链表结点后面,这样新链表就变为了 7 7 13 13 11 11 10 1 1 NULL。2.依次对它的random指针域赋值,在cur->random不为空的情况下,将 newnode->random=cur->random->next;3.解链,将新复制出来的结点从链表中解出来,同时将解下来的结点连接起来,构成的便是复制出来的链表。核心:更原创 2021-05-18 09:56:24 · 223 阅读 · 0 评论 -
链表相关面试题:返回两个链表的第一个交点,判断单链表是否有环,返回入环的第一个结点
一、返回链表的第一个交点解题思路:1.首先分别确定出两个链表的有效长度2.接着对根据统计出来的链表长度对相应的链表进行一定的位移(假如说A链表比较长的话,就需要对指向A链表的指针进行后移,直至两个链表的长度是相同的。3.再两个链表长度相同的情况下,依次进行对比,直至找出第一个相同结点为止,若已经指向NULL值,则表示两个链表中没有相交的点画图分析:struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListN原创 2021-05-17 23:41:45 · 191 阅读 · 6 评论 -
链表算法:合并两个有序链表、将小于x的数据置于链表前部分、链表的回文判断
一、合并两个有序链表方法一、通过插入思想完成1.首先确定头结点是l1链表还是l2链表2.根据l1与l2当前指向的数据判断应该插入到哪一位置3.若此时已遍历到某一链表的结束位置,则将新链表的最后一个元素指向另一链表的起始位置(从判断的当前元素开始的位置),循环结束。struct ListNode* mergeTwoLists(struct ListNode* l1, struct ListNode* l2){ struct ListNode *head = NULL,*pre = NUL原创 2021-05-15 21:22:22 · 889 阅读 · 9 评论 -
查看链表的中间结点,链表的逆序,返回链表倒数第k个结点
一、链表的逆序将链表的每个元素的指向做出改变,让它从初始链表的最后一个结点开始依次向前读取方法:1.三指针法:pre记录操作链表元素前一结点 pcur记录的是当前操作结点 pnext 记录下一结点2.将pre,pnext指向空,pre置空目的:让第一个元素的next变为空,方便读取。pnext无所谓。3.pcur->next=pre; //更改链表连接pnext=pcur->next;//保存pcur的下一结点pre=pcur;//让pre指针依次每次都指向pcur的上一个元素pc原创 2021-05-12 17:45:05 · 129 阅读 · 2 评论