数据结构
文章平均质量分 73
你快看看我
这个作者很懒,什么都没留下…
展开
-
8种面试经典排序详解--选择,插入,希尔,冒泡,堆排,3种快排及非递归,归并及非递归,计数(图+C语言代码+时间复杂度)
常见排序算法排序的概念1.排序:2.稳定性:3.内部排序:4.外部排序:一.直接插入排序二.希尔排序三.选择排序四.堆排序五.冒泡排序六.快速排序七.归并排序排序的概念1.排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。2.稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳原创 2021-05-17 20:36:04 · 1198 阅读 · 21 评论 -
设计循环队列--C语言
1.设计要求设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,返回 -1 。Rear: 获取队尾元素。如果队列为空,返回 -1 。enQueue(value): 向循环队列插入一个元素。如果成功插入则返回真。deQueue(): 从循环队列中删除一个原创 2021-04-29 11:10:45 · 1075 阅读 · 5 评论 -
堆的实现---增,删,查,改,堆排序,TopK问题(自用)
堆排序1.堆的概念及结构2.堆的性质:3.堆的实现(1)堆调整向下算法(2)堆的创建(3)堆的销毁(4)堆的插入(5)堆的删除(6)取堆顶的数据(7)堆的数据个数(8)堆的判空(9)对数组进行堆排序1.堆的概念及结构如果有一个关键码的集合K = {k0,k1, k2,…,kn-1},把它的所有元素按完全二叉树的顺序存储方式存储在一个一维数组中,并满足:Ki <= K2i+1 且 Ki<= K2i+2 (Ki >= K2i+1 且 Ki >= K2i+2) i = 0,1,2…,原创 2021-04-26 15:48:46 · 1042 阅读 · 9 评论 -
栈是不是栈,队列也不是队列---队列实现栈,栈实现队列
一、队列实现栈1.实现思路假设需要用栈存储1,2,3,4,则出栈顺序是4,3,2,1.用队列存储1,2,3,4直接出队是1,2,3,4.如果队列和栈中都只有一个数字,那么入栈出栈和入队出队就是一样的。我们使用两个队列来实现栈,队列q1和队列q2,起始两个队列都为空,我们将n个元素存入任何一个都可以,我们存入q1并且以1,2,3,4的方式一次入队。现在我们将前n-1个数字出队并依次存入q2中,此时q1中只剩下1个元素并且是刚刚入队时的最后一个元素,把这个元素直接出队,此时出队以后q1为空。在将原创 2021-04-21 20:52:02 · 368 阅读 · 2 评论 -
栈和队列基本操作--出,入,获取,检测,销毁
栈和队列1.栈的定义2.栈的增删查改(1)初始化栈(2)入栈(3)出栈(4)获取栈顶元素(5)获取栈中有效元素个数(6)检测栈是否为空,如果为空返回非零结果,如果不为空返回0(7)销毁栈3.相关练习1.栈的定义栈的概念及结构栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做原创 2021-04-20 16:17:46 · 1132 阅读 · 0 评论 -
删除链表重复结点,重复结点不保留
题目描述在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。例如,链表1->2->3->3->4->4->5 处理后为 1->2->5解题思路先定义三个结点:struct ListNode* prev=NULL;struct ListNode* cur=phead;struct ListNode* next=phead->next;当cur和next不相等时,prev,cur ,next都向前原创 2021-04-17 17:10:07 · 461 阅读 · 0 评论 -
复制带随机指针的链表
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。例如:构造这个链表的深拷贝。 深拷贝应该正好由 n 个全新节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。例如,如果原链表中有 X 和 Y 两个节点,其中 X.random -> Y ,那么在复制原创 2021-04-14 16:03:15 · 122 阅读 · 4 评论 -
寻找环形链表的入口点
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,我们使用整数来表示链表尾连接到链表中的位置(索引从 0 开始)。先定义一个节点:struct ListNode { int val; struct ListNode *next; };1.判断是否为环形链表寻找环形链表入口点的第一步,要先判断该链表是否为环形链表,环形链表的尾指针指向的位置是不确定的,可能指向首元素,这样的形成的链表环就是很大,也可能指向链表中间的随机元素原创 2021-04-13 16:44:45 · 3298 阅读 · 29 评论 -
将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序
题目描述:现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。输入:2 4 9 3 2 1 6,x=5输出:2 4 9 3 2 1 6思路:遍历链表,依次拿链表的每个节点的val和x对比,开辟两个新的链表,将小于x的节点存入一个链表,将大于或者等于的节点存入另一个链表,最后将大的链表的头节点接入小的链表的尾部。代码实现如下:struct ListNode* partition(str原创 2021-04-12 16:19:10 · 890 阅读 · 0 评论