自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(37)
  • 收藏
  • 关注

原创 用队列实现栈

创建两个队列,分别为队列1和队列2,初始情况下,数据都在队列1中。将数据从队列1移到队列2,剩下一个数据,那就是栈顶的数据。前置学习:栈和队列分别的基本实现。重复以上行为,最终用队列实现栈。首先要调用队列的一系列前置函数。

2025-06-07 23:00:48 482

原创 队列的概念及实现

要插入节点,首先需要malloc一个新节点,随后进行判断,如果在初始情况,那么还没有节点,这个时候的phead和ptail就都指向新节点;队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)),我们使用了数组作为底层结构,但是队列采取的是队尾进,队头出,用数组不太合适,所以选择用更方便的单链表。既然底层是单链表,那我们就先创造一个结构体表示单链表。入队列:进行插入操作的一端称为。出队列:进行删除操作的一端称为。

2025-06-07 20:53:56 966 1

原创 有效的括号题解

第二种:有额外的括号游离于匹配的括号之外,那我们也可以调用判空函数,如果不为空,代表有游离的括号,也返回false。第三种:恰好数量匹配,那我们就一个一个看是否匹配,如果匹配,就走到字符串下一个字符继续看,直到遍历完字符串。那如果遇到的是右括号,就用我们的思路:遇到右括号就取栈顶的括号尝试匹配。2.我们利用栈后进先出的特点,遇到左括号就入栈,遇到右括号就取栈顶的括号尝试匹配。第一种:给的字符串为空,那么我们可以调用判空函数,如果是空,直接返回false。

2025-06-07 11:21:44 293 1

原创 栈的概念以及实现

一开始,数组为空,并且top和capacity都为0,这里的top有两种初始化方法,如果我们想让他指向栈中的最后一个数据,那么它的值就不能是数组的起始下标0,而应该给一个无关的数,比如-1;栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。例:比如手枪弹夹,先压进去的子弹往往是后发射出去,也就是遵循后进先出的原则。栈是一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。压栈:栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。出栈:栈的删除操作叫做出栈。

2025-06-06 20:57:50 593 1

原创 相交链表的解答

1.先判断两个链表是否相交,定义两个指针分别指向两个链表,遍历链表,这个时候两个指针分别指向各自链表的尾结点,进行比较,如果不相同就是不想交,返回NULL,相同就是相交。2.两个链表是不一样长的,那我们可以通过第一步的循环得到两个链表的长度,这个时候再定义两个指针,一个指向长链表,一个指向短链表。3.计算长短链表的距离差,让指向长链表的节点先走,达到长短链表的指针在同一起跑线的效果。4.这个时候再进行比较,遍历整个链表,如果不相同,就继续往后移动,如果相同就停止循环。

2025-05-04 08:00:00 193 1

原创 环形链表解答

2.如果这是一个带环链表,那快慢指针迟早都会进入环内,这个时候快指针先进,慢指针后进。3.在环内可以看成一个追击问题,快指针开始追慢指针,如果快指针最后追到了,那就是带环。1.使用快慢指针,定义两个指针,快指针一次走两步,慢指针一次走一步。4.如果没有追上,并且快指针指向了NULL,就代表它不是带环指针。

2025-05-04 08:00:00 148 1

原创 随机链表的复制 题解

2.我们先定义一个指针cur指向头结点,然后利用cur遍历链表,接着我们创建一个节点copy,每当cur指向一个节点,cur的next指针指向就变为指向copy,比如一个单链表,它是4->7->8,那经过修改,他就变成了4->4->7->7->8->8。4.返回所需要的节点,这个也很简单,定义一个cur指向头结点,那么它的下一个节点设置为copy,copy的next设为next,接着设置一个copyhead和copytail,尾插入节点中,最后返回copyhead,完成解答。

2025-05-04 07:00:00 241 1

原创 环形链表II 解答

4.这个时候我们可以判断,也就是如果head走L的距离,同时meet与head一起移动,那么meet也就是走了x*C-N,也就是走了x圈的环,又走了-N的距离,也就是到达K,而head走L的距离也是到达K,这个时候两个点正好相遇。1.首先我们看图,假设环的长度是C,在进入环之前,长度为L,头结点是head,链表进入环的节点是K。3.现在对比meet和head指针,head是指向头结点的指针,如果meet和head不相同,就让他们各往后移动一格,如果相同,则返回他们相遇的节点。slow走的距离是:L+N。

2025-05-04 06:00:00 329

原创 链表的回文结构题解

3.有了两个前置函数middleNode()和reverseList(),可以很好的解决题目。3.现在有两个链表,第一个链表取头节点一直到中间节点、第二个链表取头结点到尾结点。4.比较两个链表,从头比到尾,如果都相同,就返回true,否则返回false。while循环比较两个链表,都相同返回true,有一个不相同就返回false。2.他的时间复杂度为O(n)、空间复杂度为O(1)2.利用一个函数逆置中间节点往后的所有节点。1.首先利用一个函数找到中间节点。定义两个指针接受函数的返回值;

2025-05-03 15:09:14 442 1

原创 返回倒数第k个节点题解

4.当快指针到达尾结点,循环结束,这个时候往前k个的节点恰好是慢指针指向的节点。2.先让快指针往后走k步,也就是移动k个节点,这个时候快指针比慢指针领先k。1.定义两个指针,一个快指针,一个慢指针,初始都指向头结点。3.现在让快慢指针同时往后移动,两指针之间距离不会变。5.返回慢指针指向节点的val。这题要用到快慢指针的思想。

2025-05-03 14:40:12 320 1

原创 双向链表详解

4.newnode有两个指针,它现在是新的尾结点,所以她的next指针指向头结点phead,它的prev指针指向前一个节点也是就phead->prev指向的节点,那原来的尾结点的next指针也要改变,改完指向下一个节点也就是newnode,头结点的prev指针也要改变,现在它指向新的尾结点也就是newnode。4.phead->next指针指向的节点的prev指针改变指向,现在指向newnode,phead指向节点的next指针改变指向,现在指向newnode。newnode的prev指针指向phead。

2025-05-02 21:45:54 2006 1

原创 分割链表题解

1.再原链表上进行修改,定义一个指针pcur指向头结点。当pcur指向的节点的值小于x,pcur直接往后走,如果pcur指向的节点的值大于x,删除pcur指向的节点,并将这个节点尾插到链表后面。3.创建新链表:小链表和大链表;小链表存放的都是小于x的节点,大链表存放的都是大于x的节点,然后让小链表的尾结点和大链表的第一个节点相连。2.创建一个新链表,遍历原链表,若pcur节点的值小于x,头插在新链表中;若pcur节点的值大于或等于x,尾插在新链表中。

2025-04-30 14:43:27 148 1

原创 环形链表的约瑟夫问题

3.遍历链表,建立一个指针pcur指向当前节点,再建立一个指针prev指向pcur指的节点的前一个节点,当要删除pcur的时候,只需要让prev->next = pcur->next,这样子就跳过了pcur,再将pcur给free掉就好了,如此循环,最后只剩一个值。接下来写一个循环,每次都count++,那如果count达到了题目限制的m,就删那个pcur,并且在free之前,要记得先把prev和pcur->next连起来,如果count没有达到限制的m,就正常往后走。2.要把链表头尾向连,形成带环链表。

2025-04-30 14:17:52 153 1

原创 反转链表的问题解答

2.一开始n1指向NULL,n2指向链表开头,我们用n2遍历链表,n3=n2,n3在自己指向下一个节点。这样子循环的时候,就变成n2变成了新链表的尾节点,依次遍历。3.如果原链表一开始就是空,那么不需要反正,直接输出。1.创建三个指针n1,n2,n3。

2025-04-30 08:00:00 261 1

原创 合并两个有序链表

5.list1和list2也要判断他们一开始是否为空,如果有空,则直接返回另一个链表,如果都为空,就返回NULL。6.通过比较,肯定会有一个链表的节点先被遍历完,这个时候要判断,然后将还没有被遍历完的链表的值放入新链表。2.给一个新指针l1指向list1,给定一个新指针l2指向list2。3.比较l1和l2的值,那个值更小,那个值就移入新链表中。4.新链表有两种情况,新链表是空和新链表不是空的情况。1.创建一个新链表,给定它的头指针和尾指针。

2025-04-30 08:00:00 110 1

原创 链表的中间节点

的思想,快指针叫fast,慢指针是slow,快指针每次往后移两个节点,slow只移动一个节点,这样子fast的速度是slow的两遍,当fast遍历完链表,slow才遍历一半,正好就在中间。

2025-04-29 19:33:31 273 2

原创 移除链表元素

1.将struct ListNode 重命名为LSTNode,方便后面编写。2.创建一个新链表,如果上面链表的值不是val,就移到下面来。3.创建一个指针pcur,遍历原链表。

2025-04-29 18:53:43 161 2

原创 单链表详解

这里假设位置是pos,那要判断链表不为空以及pos不能为空,首先找到pos节点和pos前一个节点,然后我们调用函数创建一个新节点newnode,那让newnode的next指向pos,pos之前的节点的next指向newnode,就插入成功了。我们在接受的时候,用pphead接受&plist,那就用*pphead接受*plist,用**pphead接受第一个节点plist,所以这里要用**pphead!链表是由一个一个节点组成的,每个节点里面有数据,那如何将每个节点链接一起呢,我们规定,

2025-04-29 14:56:31 1860 3

原创 合并两个有序数组题解

2.l1和l2肯定会有一个先出数组,如果l2先出,那没有关系,因为l1还没有算到的数就按顺序已经在数组nums1中了。如果l1先出,那就遍历nums2,把nums2的数组都拿出来。1.l1和l2比较,更大的赋值给l3,然后l3和max(l1,l2)都向前移动一格,也就是l3--,max(l1,l2)--题目给了两个数组nums1和nums2,分别有两个整数m和n,表示nums1和nums2中元素个数,我们需要合并数组,所以。

2025-04-26 23:21:38 213 2

原创 移除数组题解

(如果前面有val,这时候代表src指针是更快的,而dst就是更慢的),然后src和dst都往后移动一格,也就是。比如数组给 3,2,2,3,2 如果val是3,则移除两个3,数组变成 2,2,2 并且返回个数3.,给定一个值val,如果是val,则移除数组中所有这个数字,并且返回移除后的数组中剩余的元素k。2. 如果src所指的是val,那么只有src往后移一格,也就是。1. 定义一个指针是src,另一个指针是dst,3.如果src所指的不是val,那就让。src所对应的值赋值给dst对应的值。

2025-04-26 22:29:15 147 2

原创 基于顺序表实现通讯录

基于顺序表实现通讯录

2025-04-26 21:34:13 752 2

原创 顺序表详解

首先我们思考一个顺序表,它的底层结构是数组,所以说我们肯定要定义一个数组,其次我们还需要定义一个size来表示顺序表中有效的数字个数,另外还需要一个capacity来表示顺序表容量空间的大小,这时候我们就需要一个结构体,将这三个包含起来。我们要初始顺序表,可以自己编写一个函数,SLInit,那我们要将顺序表传入这个函数,那么要使用传址调用,因为如果使用传值调用,函数调用完之后,形参会被释放,返回主函数之后,我们发现顺序表没有变化,因此要用传址调用。,所以要调用顺序表,给定位置pos,插入的数据x;

2025-04-24 01:34:23 2093 1

原创 时间复杂度和空间复杂度详解

这里我们可以看循环次数,也就是2*N+M次,规范表达,我们要用符号O() , 也就是O(2*N+M) , 这里M是10,N是一个未知数,那这个可以写成O(2*N+10),这个表达式是需要进一步简化的,这里引入大O渐进表示法。这里用来递归,N调用了N-1、N-2, N-1调用了N-2、N-3 ,以此类推,一共开辟了 N、N-1、N-2、N-3 —— 3、2、1 , 那么它的空间复杂度就是N,也就是O(N).算法描述的操作是可以用有限的基本运算来实现的。

2025-04-23 19:04:09 767 1

原创 王道数据结构第一章1.1笔记

4. 逻辑结构:逻辑结构是在逻辑上描述数据,不涉及数据在计算机中的存储细节,它与数据的存储无关,一般分为线性结构和非线性结构,非线性结构有集合、树形结构和图状结构。ADT:用数学化的语言定义数据的逻辑结构、定义和运算(我认为就相当于给出公式),于具体实现无关。5. 物理结构(存储结构):数据在计算机中的存储,分为顺序结构和非顺序结构,顺序结构有。,运算实现是针对存储结构的,相当于让计算机利用公式进行计算。是针对逻辑结构的,也就是给出思路,给出公式,然后进行。逻辑结构,一定程度上,就可以决定存储结构。

2025-04-23 16:51:32 241

原创 轮转数组题解

n是数组本身元素的个数,所以每移动n次,就相当于数组移回了自己本身,那么我们可以将k简化,k%=n,这里就可以将k限制在n以内,方便计算,那么时间复杂度就是o(k*n),时间复杂度要计算最复杂的程度,也就是o(n*(n-1)), 那么就是o(n^2), 这里如果直接计算,在遇到很大数据的时候,会栈溢出,所以我们用一个巧妙的方法!首先分析题目,数组每旋转一次,会发现移动了k次,那这里的时间复杂度就是k。逆置函数完成后,按照一开始的思路,调用三次,题目解答完成!1. 将前n-k个数据逆置。

2025-04-22 23:29:48 297

原创 异或的简洁理解

1 2 1 异或也是2。异或没有顺序: 1 1 2 异或是2。0和任何数异或,结果都是任何数。

2025-04-22 21:10:00 80

原创 C语言结构体入门

对结构体产生一定的了解,以及对其基本使用方法进行掌握

2023-08-25 18:28:48 97 2

原创 C语言指针入门

关于C语言指针的基础教学

2023-08-23 23:46:06 103 1

原创 C语言操作符详解

一个整型有4个字节,即32个比特位,最左边的一位是最高位,是符号位,正数符号位是0,负数符号位是1。整数在内存中存储的是补码,我们在计算的时候,也是使用补码计算,所以移位操作符移动的也是补码,我们需要根据补码求出原码,得到所需答案。算数操作符有:+、 -、*、/、% 这几个操作符分别为加、减、乘、除和取模,加减乘除相信大家都非常了解,取模就是进行除法的时候去余数。如果某个操作符的各个操作数属于不同的类型,那么除非其中一个操作数的转换为另一个操作数的类型,否则操作就无法进行。取决于他们的优先级。

2023-08-20 17:52:42 114 2

原创 C语言扫雷详解

C语言扫雷详解,帮助读者快速学习扫雷游戏的代码实现

2023-08-18 12:45:23 124 2

原创 C语言实现三子棋

所以针对以上要求,我们要分步骤进行:第一步:显示一个菜单,让玩家选择是否游玩三子棋。我们使用test.c进行操作步骤的显示、使用game.c进行关于每个步骤代码的编写,使用game.h将每个函数的声明放入其中,用game.c和teat.c分别引用game.h的头文件。首先我们要了解三子棋,三子棋是两位玩家在3*3的棋盘上进行对弈,一个人下 '#' ,一个人下 '*' ,谁先实现三个棋子连成一条线,就获得胜利。我们要设计一个目录,询问玩家是否游玩三子棋,输入1游玩,输入0退出,输入其他数字进行重新输入。

2023-08-13 21:59:22 61 2

原创 C语言数组详解

关于C语言数组详解以及冒泡排序的讲解

2023-08-11 15:10:25 98 3

原创 C语言的函数详解

关于C语言的函数详解

2023-08-06 00:28:34 399 1

原创 C语言的分支和循环语句详解

分支和循环

2023-07-30 20:43:59 380 2

原创 数据在内存中的存储

基本内置类型包含整型和浮点型,整型包含short、long、int、long long、char等等,而浮点型则包含float、double、long double等等,它们所占用的字节也各不相同:char-1字节,shor-2字节、int-4字节、long-4/8字节、float-4字节,double-8字节等等。①:而为什么char输入整型,原因是:字符存储的时候,存储的是ASCII码值,是整型,所以归类的时候放在整型。一般short,long,int,long long都表达的是有符号的。

2023-06-04 01:22:46 153 2

原创 C语言实现简易的猜数字游戏

c语言如果编写猜数字游戏

2023-04-22 22:17:12 379 2

原创 我的第一篇博客

我是一个喜欢编程的小萌新,我要开始深入学习编程啦,我将从c语言开始入手,c语言是一门通用的计算机编程语言,有着悠久的历史和广泛的应用,其兼容性也很好,常年排在编程语言的前三位。我将从c语言开始学习,逐渐深入,去学习数据结构、c++,linux等等,争取早日能成为编程大佬。我相信只有坚持不懈的去学习他,才能让我得到提高,早日进入编程大佬的行列。我也把我的目标定的高一点,我希望以后能进入腾讯,拿到好offer,对此我也要拼尽全力,要拿出能实现这目标而相对应的努力,梦想还是要有的,万一实现了呢。

2023-04-01 14:45:53 137 4

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除