数据结构刷题
石马马户
这个作者很懒,什么都没留下…
展开
-
BM1 反转链表
以下图所示链表为例,这里介绍两种方法,一种是使用改变指针的方法,一种是使用递归。先移动next指针,再不断的将cur指向pre,并不断移动pre和cur。定义pre指针,cur指针和next指针。最终结果如下图,pre指向链表的头结点。原创 2023-04-08 22:45:00 · 74 阅读 · 0 评论 -
BM2 链表内指定区间反转
根据m的值,cur指向m位置的节点,node = cur->next,不断的将node节点放到pre后面。创建一个newHead节点,定义pre指针、cur指针和node指针。原创 2023-04-09 11:42:52 · 38 阅读 · 0 评论 -
BM3 链表中的节点每k个一组翻转
根据k值找到要翻转的节点区间,这里以k=3为例,那么cur作为区间的起点,tail为终点。接下来就要翻转cur和tail之间的节点,这里可以封装为一个函数reverse。翻转区间代码接着寻找下一个待翻转的区间,将cur与tail之间的节点翻转即可。创建一个链表节点preHead作为哨兵节点。并是pre指针指向这个节点。如何找到tail的位置是关键。代码可以编写如下,达到上图节点的位置。可以看下图了解区间节点代码翻转。经过翻转区间节点代码如下图所示。翻转区间节点代码图示如下。原创 2023-03-31 08:44:07 · 49 阅读 · 0 评论 -
BM4 合并两个排序的链表
定义pre指针,newHead节点指针和next指针。pHead1->val与pHead2->val的值相比较,next指向较小值的后一个节点。将pre->next指向不为空的节点,即pHead1,就完成了两个排序的链表。不断比较两个节点的值,移动较小值对应的节点指针和pre和next指针。直到pHead1或pHead2为空,如下图所示。原创 2023-04-10 15:55:09 · 86 阅读 · 0 评论 -
BM5 合并k个已排序的链表
先将pHead1和pHead2链表经Merge函数合并为L,在将pHead3和pHead4经Merge函数合并为R,再将L和R经Merge函数合并,即完成了4个链表的合并排序。定义Merge函数,Merge函数的功能是将两个链表合并为一个有序的链表。原创 2023-04-11 10:19:27 · 43 阅读 · 0 评论 -
BM6 判断链表中是否有环
假如有环,一定相遇于环中某点。设置快慢指针,都从链表头出发,快指针每次。慢指针每次走一步,只要有环一定会相遇。原创 2023-04-12 09:45:03 · 37 阅读 · 0 评论 -
BM7 链表中环的入口结点
链表头到环入口长度为m,环入口到相遇点长度为c1,相遇点到环入口长度为c2则:相遇时。原创 2023-04-13 08:40:01 · 41 阅读 · 0 评论 -
BM8 链表中倒数最后k个结点
以下图所示链表为例定义fast指针和slow指针,让fast先移动k步,然后slow和fast一起向后移动,当fast指向NULL时,slow则指向倒数第k个节点。原创 2023-04-17 09:05:18 · 36 阅读 · 0 评论 -
BM9 删除链表的倒数第n个节点
然后cur指针和pre指针一起向后走,当cur指向NULL时,pre则指向倒数第n个节点的前一个节点。创建一个newHead节点,定义pre指针指向newHead和cur指针指向pHead。:找到倒数第n个节点的前一个节点,就可以。先让cur指针先走n步,原创 2023-04-19 21:47:37 · 41 阅读 · 0 评论 -
BM10 两个链表的第一个公共结点
假设链表1公共节点前的节点为m个,链表2公共节点前的节点数为n个,假设m!=n,公共节点为c个,当head1第二次指向第一个公共节点的时候,head1走了m+c+n,当head2走了m+n+c步时,此时head2也指向链表的第一个公共节点。head1和head2相比较,若不相等,则分别向后移动,若为NULL则将指针指向另一个链表的首节点,再继续移动比较。当head1和head2第一次相等时,指向的是链表的第一个公共节点或NULL。定义head1指针指向链表1的首节点,定义head2指针指向链表2的首节点。原创 2023-05-02 15:04:16 · 33 阅读 · 0 评论 -
BM11 链表相加(二)
因为链表是单链表从尾部相加,所以将两个链表翻转后,从头结点依次将节点值相加,放入到新创建的节点 node->val中然后将node->next指向newHead,再将newHead指向node。将head1节点的值和head2节点的值相加,直到进位为0且两个节点都为空,最终结果如下图所示。原创 2023-05-16 21:03:20 · 38 阅读 · 0 评论 -
BM12 单链表的排序
链表进行升序排列,将head链表分为两个链表,以head为首的一个链表和以mid为首的两个链表。这里的前提是head和mid必须是。,这里可以将head链表再次分为两个链表,直到将一个链表分成只有一个节点或者为NULL的时候就是升序的链表。使用快慢指针的思想,定义fast指针,mid指针,当fast到链表尾的时候,mid指向链表的中点。,才算真正的将链表分为两个,一个是以head为首的,另一个是以mid为首的两个链表。当快指针到末尾时,慢指针在链表的中点,以head为首的链表left指向的节点。原创 2023-06-30 21:19:34 · 42 阅读 · 0 评论 -
BM13判断一个链表是否为回文结构
对于链表节点数目为奇数(节点数为1的除外)来说,ptr2的位置同样是mid->next。方法:这里采用的方法是先找到链表的后一半,将链表的后一半进行翻转之后再和前一半链表进行比较。这里的图示以上图奇数节点链表为例,这里将翻转链表函数的返回值赋值给ptr2。对于链表节点数目为偶数来说,ptr2的位置是mid->next。翻转链表的方法有多种,这里采用的是改变指针方向的方式翻转链表。转化为如何找到ptr2的位置,采用快慢指针找ptr2。接下来就是从ptr2开始将后面的链表翻转。原创 2023-04-04 11:37:08 · 78 阅读 · 0 评论 -
BM14 链表的奇偶重排
odd作为奇节点的指针,even作为偶节点的指针,上图中的odd节点的连接,odd->next = even->next, odd节点的移动,odd = even->next, even节点与odd节点类似。下图是odd和even节点连接和移动一次。不断的移动连接odd与even指针,会得到奇数节点链表和偶数节点链表,如下图。原创 2023-04-05 09:44:10 · 40 阅读 · 0 评论 -
BM15 删除有序链表中重复的元素-I
定义cur和next指针,通过比较cur和next节点值从而删除重复的节点。如果cur节点的值与next节点的值相等,则只移动next。cur节点值与next节点值不相同,移动cur和next。不断移动cur和next最终结果如下图。原创 2023-04-06 09:16:51 · 41 阅读 · 0 评论 -
BM16 删除有序链表中重复的元素-II
cur->next节点值与cur->next->next节点值相同,定义temp保存cur->next的值,temp的值不断和cur->next节点的值相比较。创建一个newHead节点,定义cur指针,通过比较cur->next和cur->next->next节点值从而删除重复的节点。不断比较temp和cur->next值比较结果如下图。原创 2023-04-07 15:02:12 · 83 阅读 · 0 评论 -
BM87合并两个有序的数组
合并两个有序数组原创 2022-10-27 22:30:57 · 116 阅读 · 0 评论