![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
数据结构
文章平均质量分 57
不爱喝水的大脸猫
这个作者很懒,什么都没留下…
展开
-
数据结构之栈和队列
文章目录栈队列队列的概念及结构队列的实现本章学习线性表中的栈和队列。栈队列队列的概念及结构队列是限制在两端进行插入操作和删除操作的线性表,允许进行存入操作的一端称为“队尾”,允许进行删除操作的一端称为“队头”。队列的特点:1.队列具有先进先出FIFO(First In First Out) 或者后进后出LILO(Last In Last Out)2.队列只能在队头和队尾进行数据操作队列的实现队列也可以用数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构(顺序存储,原创 2022-01-11 13:39:23 · 505 阅读 · 0 评论 -
leetcode 622.设计循环队列
设计你的循环队列实现。 循环队列是一种线性数据结构,其操作表现基于 FIFO(先进先出)原则并且队尾被连接在队首之后以形成一个循环。它也被称为“环形缓冲器”。循环队列的一个好处是我们可以利用这个队列之前用过的空间。在一个普通队列里,一旦一个队列满了,我们就不能插入下一个元素,即使在队列前面仍有空间。但是使用循环队列,我们能使用这些空间去存储新的值。你的实现应该支持如下操作:MyCircularQueue(k): 构造器,设置队列长度为 k 。Front: 从队首获取元素。如果队列为空,返回 -1 。原创 2022-01-11 13:37:36 · 195 阅读 · 0 评论 -
leetcode 20.有效的括号
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。思路:遇到左括号,进栈,遇到右括号,出栈匹配考虑两种情况:1.遇到右括号,但是栈尾空2.右括号都匹配完了,栈中还有左括号typedef char STDataType;typedef struct Stack{ STDataType* a; int top; int capacity;}ST;vo原创 2022-01-09 22:39:02 · 185 阅读 · 4 评论 -
顺序表、链表
文章目录线性表顺序表概念及结构接口实现相关OJ链表本章我们主要学习线性表中的顺序表和链表。线性表线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表的定义是描述其逻辑结构,而通常会在线性表上进行的查找、插入、删除等操作。线性表在逻辑上是线性结构(一对一)。但是在物理结构上并不一定是连续的,在计算机存储器中的存储一般有两种形式,一种是顺序存储(内存空间连续,数组),一种是链式存储(内存空间不一定连续)。常见的线性表:顺序表、链表、栈、队列、字符串…顺序表概念及结构顺原创 2022-01-09 17:23:47 · 984 阅读 · 0 评论 -
leetcode 138.复制带随机指针的链表
给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 。思路:1.复制原链表的所有结点,将新结点各自插入到原结点的后面2.根据原结点的random原创 2022-01-07 22:05:41 · 365 阅读 · 1 评论 -
leetcode 142.环形链表II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。不允许修改 链表。输入:head = [3,2,0,-4], pos = 1输出:返回索引为 1 的链表节点解释:链表中有一个环,其尾部连接到第二个节点。思路1:首先,判断链表是否有环,使用快慢指针来判断,如果有环,找到快慢指针相遇的结点其次,如果有环,定义两个指针,分别从链表头结点cur和快慢指针相遇的结点meet开始走,两个指针每次都走一步,那么这两个指针必然在入环第一个结点处相遇。struct ListN原创 2022-01-07 16:37:22 · 433 阅读 · 0 评论 -
leetcode 141.环形链表
给你一个链表的头节点 head ,判断链表中是否有环。如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。如果链表中存在环,则返回 true 。 否则,返回 false 。输入:head = [3,2,0,-4], pos = 1输出:true解释:链表中原创 2022-01-07 10:48:49 · 108 阅读 · 0 评论 -
leetcode 160. 相交链表
给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。图示两个链表在节点 c1 开始相交:思路1:暴力求解(穷举法)依次取A链表中的每个结点和B链表中的所有结点进行比较,如果有地址相同的结点,就是相交,第一个相交的点。时间复杂度是O(N2N^2N2)思路2:时间复杂度优化到O(N)1.分别遍历两个链表,记住长度,如果两个链表的尾结点相同,则必然相交,否则不相交。2.找交点:让长的链表先走(走长度差),然原创 2022-01-06 20:15:57 · 299 阅读 · 1 评论 -
牛客OR36 .链表的回文结构
对于一个链表,请设计一个时间复杂度为O(n), 额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。思路1:找到链表的中间结点,然后拆开链表,分成两部分,将后半部分逆置,后半部分和前部分比较是否相等,只要有一个走到NULL了,就结束(1)偶数个(2)奇数个这种方法,要把链表拆开思路2:不拆链表(1)偶数个找到中间结点,中间结点后的部分逆置,不要拆开(2)奇数个stru原创 2022-01-06 16:34:09 · 989 阅读 · 0 评论 -
牛客CM11 链表分割
现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。如果不要求保持相对顺序不变,那么小于x的结点头插,大于x的结点尾插。但是要求保持相对顺序不变,这种方法就不适用。创建两个新链表,一个存放小于x的结点,一个存放大于x的结点,然后将两个链表链接起来。创建两个带哨兵位的头结点这里要注意,在原链表中,结点7的下一个结点是3,所以这里必须将结点7的next置为NULL,原创 2022-01-06 14:13:06 · 132 阅读 · 0 评论 -
leetcode 21.合并两个有序链表
将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。输入:l1 = [1,2,4], l2 = [1,3,4]输出:[1,1,2,3,4,4]思路:依次比较两个链表结点,取小的那个结点尾插到新链表中。初始条件:要记住新链表的头结点,使用指针head来记录新链表的头结点使用指针tail来记录新链表的尾结点struct ListNode { int val; struct ListNode* next;};struct原创 2022-01-06 10:24:16 · 539 阅读 · 0 评论 -
leetcode 876.链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。示例 1:输入:[1,2,3,4,5]输出:此列表中的结点 3 (序列化形式:[3,4,5])返回的结点值为 3 。示例 2:输入:[1,2,3,4,5,6]输出:此列表中的结点 4 (序列化形式:[4,5,6])由于该列表有两个中间结点,值分别为 3 和 4,我们返回第二个结点。思路1:遍历链表,求出长度,再次遍历找到中间结点,需要遍历链表两次,时间复杂度O(N).思路2:要求原创 2022-01-06 08:53:05 · 453 阅读 · 0 评论 -
leetcode 206.反转链表
给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。输入:head = [1,2,3,4,5]输出:[5,4,3,2,1]思路1:初始时,n1 = NULL, n2 = head, n3 = head->nextn2的next赋值为n1n1 赋值为n2, n2赋值为n3,n3赋值为n3->nextn2的next赋值为n1n1赋值为n2,n2赋值为n3,n3赋值为n3->next重复上述操作结束条件:n2 = NULLstruct原创 2022-01-05 21:40:09 · 235 阅读 · 0 评论 -
leetcode 203.移除链表元素
给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足Node.val == val 的节点,并返回 新的头节点 。示例 1:输入:head = [1,2,6,3,4,5,6], val = 6输出:[1,2,3,4,5]示例 2:输入:head = [], val = 1输出:[]示例 3:输入:head = [7,7,7,7], val = 7输出:[]思路:使用两个指针,prev和cur,cur记录当前指针位置,prev记录前一个位置如果cur->原创 2022-01-05 15:43:01 · 245 阅读 · 0 评论 -
leetcode 88.合并两个有序数组
给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。注意:最终,合并后数组不应由函数返回,而是存储在数组 nums1 中。为了应对这种情况,nums1 的初始长度为 m + n,其中前 m 个元素表示应合并的元素,后 n 个元素为 0 ,应忽略。nums2 的长度为 n 。例1:输入:nums1 = [1,2,3,0,0,原创 2022-01-04 22:31:54 · 353 阅读 · 2 评论 -
数据结构和算法基本概念
文章目录什么是数据结构?数据数据元素数据结构数据之间的结构关系逻辑结构存储结构什么是算法?算法的特性评价算法好坏的方法时间复杂度大O的渐进表示法空间复杂度什么是数据结构?数据数据即信息的载体,是能够输入到计算机中并且能被计算机识别、存储和处理的符号总称。文字、视频、音频等等,都是数据,数据并不仅仅指数字。数据元素数据元素是数据的基本单位,又称之为记录(Record)。一般数据元素由若干基本数据项组成。数据结构数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一原创 2021-10-29 13:37:58 · 371 阅读 · 0 评论