数据结构
每日一道数据结构代码题
DTRblank
祝我年少有为不自卑。
展开
-
考研数据结构(每日一题)day60
考研数据结构(每日一题)题目:设计一个算法用于判断带头结点的循环双链表是否对称。算法思想:让p从左向右扫描,q从右向左扫描,直到它们指向同一结点(当循环双链表中结点个数为奇数时,p==q)或相邻(当循环双链表中结点个数为偶数时p->next=q或q->prior=p)为止,若它们所指结点值相同,则继续进行下去,否则返回0。若计较全部相等,则返回1。完整代码:int Symmetry(DLinkList L){ DNode *p = L -> next,*q = L -&原创 2022-05-10 09:13:16 · 504 阅读 · 0 评论 -
考研数据结构(每日一题)day59
考研数据结构(每日一题)题目:已知一个整数序列A=(a0,a1,…,an-1),其中0<=a1<n(0<=i<n)。若存在ap1=ap2=…=apm=x且m>n/2(0<=pk<n,1<=k<=m),则称x为A的主元素。例如A=(0,5,5,3,5,7,5,5),则5为主元素,又如A=(0,5,5,3,5,1,5,7),则A中没有主元素。假设A中的n个元素保存在一个一维数组中,请设计一个尽可能高效的算法,找出A的主元素。若存在主元素,则输出该元素,否则原创 2022-05-09 11:49:39 · 1462 阅读 · 1 评论 -
考研数据结构(每日一题)day58
考研数据结构(每日一题)题目:设有一个带头节点的循环单链表,其结点值均为正整数。设计一个算法,反复找出单链表中结点值最小的结点并输出,然后将该结点从中删除,直到单链表为空为止,再删除表头结点。算法思想:反复找到当前的最小值结点,并删除,直到链表为空,释放头结点L。完整代码:typedef struct LNode{ int data; struct LNode *next;}void Delete_min(LinkList &L){ LNode *pre = L原创 2022-05-07 11:23:21 · 512 阅读 · 0 评论 -
考研数据结构(每日一题)day57
考研数据结构(每日一题)题目:后序遍历的非递归算法算法思想:沿着根的左孩子依次入栈,直到左孩子为空读栈顶元素(判定),若其右孩子不空且未被访问,将右子树执行第一步栈顶元素出栈入栈向左一直走,判定(右子树),出栈访问,标记,重置完整代码:void PostOrder(BiTree T){ InitStack(S); p = T; r = NULL; while (p || !IsEmpty(S)) { if (p) //原创 2022-05-06 10:26:17 · 411 阅读 · 0 评论 -
考研数据结构(每日一题)目录
考研数据结构(每日一题)目录将这些天做的题进行了一个小汇总,点击相应的链接就能找到啦。有些代码会有点小问题,各位大佬求指教。day56题目:计算二叉树中所有的叶子结点个数https://blog.csdn.net/DTRblank/article/day55:题目:已知一棵二叉树链式存储,设计一个算法,输出根结点到每个叶子结点的路径。https://blog.csdn.net/DTRblank/article/day54:题目:假设二叉树采用二叉链表结构存储,设计一个算法,求原创 2022-05-05 10:58:00 · 784 阅读 · 0 评论 -
考研数据结构(每日一题)day56
考研数据结构(每日一题)题目:计算二叉树中所有的叶子结点个数算法思想:递归法:F(n)=F(左叶子结点)+F(右叶子结点)遍历(这里用先序遍历)完整代码:int count(BTNode *p){ int n1,n2; if (p == NULL) //递归边界 { return 0; } if (p -> lchild == NULL && p -> rchild == NULL) {原创 2022-05-05 10:09:15 · 909 阅读 · 0 评论 -
考研数据结构(每日一题)day55
考研数据结构(每日一题)题目:已知一棵二叉树链式存储,设计一个算法,输出根结点到每个叶子结点的路径。算法思想:遍历(先序遍历)对特殊的结点(叶子结点)进行处理需要借助一个栈完整代码:Elemtype stack[maxsize];void path(BTNode *p){ int i = 0,top = 0; if (p != NULL) //不为空,则结点值入栈 { stack[top] = p -> data;原创 2022-05-03 15:40:09 · 887 阅读 · 0 评论 -
考研数据结构(每日一题)day54
考研数据结构(每日一题)题目:假设二叉树采用二叉链表结构存储,设计一个算法,求二叉树中值为x的层号。算法思想:遍历定义一个p指针,要明确向左走层数+1,当返回时,层数要-1。关键是要知道什么时候层数加一,什么时候层数减一。完整代码:void fun(BTNode *p,int x){ int h = 1; if (p != NULL) { if (p -> data == x) //遍历 { print原创 2022-04-30 16:33:39 · 1380 阅读 · 0 评论 -
考研数据结构(每日一题)day53
考研数据结构(每日一题)题目:已知由n(n>=2)个正整数构成得到集合A={ak|0<=k<n},将其划分为两个不相交的子集A1和A2,元素个数分别是n1和n2,A1和A2中的元素之和分别为S1和S2,设计一个尽可能高效的划分算法,满足|n1-n2|最小且|S1-S2|最大。算法思想:将最小的n/2个元素放在A1中,其余的元素放在A2中,分组即可满足题目要求。按照快速排序的思想,基于枢轴将n个整数划分为两个子集。根据划分后枢轴所处的位置i进行处理:若i=n/2,则分组完成,算法原创 2022-04-29 14:12:29 · 2260 阅读 · 0 评论 -
考研数据结构(每日一题)day52
考研数据结构(每日一题)题目:荷兰国旗问题:设有一个仅有红、白、蓝三种颜色的条块组成的条块序列,请编写一个时间复杂度为O(n)的算法,使得这些条块按红、白、蓝的顺序排好,即排成荷兰国旗图案。算法思想:顺序扫描线性表,将红色条块交换至线性表的最前面,蓝色条块交换至线性表的最后面。设置三个指针,j:工作指针,表示当前扫描的元素,i以前的元素全部为红色,k以后的元素全部为蓝色。根据j所指示元素的颜色,决定将其交换至前部或尾部。初识时i=0,k=n-1完整代码:typedef enum { RE原创 2022-04-28 10:31:52 · 847 阅读 · 0 评论 -
考研数据结构(每日一题)day51
考研数据结构(每日一题)题目:编写一个算法,使之能够在数组L[1…n]中找出第k小的元素(即从小到大排序后处于第k个位置的元素)算法思想:首先本题可以采取排序算法对数组进行从小大的排序,然后提取L(k),如此便得到了第k小元素,但是平均时间复杂度为O(nlog2n)以上。还可采用小顶堆的方法,每次堆顶的元素都是最小值元素,时间复杂度为O(n+klog2n)以下详细写一下关于快速排序的操作方法:从数组L[1…n]中选择一个轴pivot(随机或者取第一个)进行和快速排序一样的划分操作原创 2022-04-27 14:34:30 · 292 阅读 · 0 评论 -
考研数据结构(每日一题)day50
考研数据结构(每日一题)题目:已知线性表按顺序存储,且每个元素都是不相同的整数型元素,设计所有奇数移动到所有偶数前面的算法。算法思想:使用快速排序思想,假设表为L[1…n],先从前向后找到一个偶数元素L(i),再从后向前找到一个奇数元素L(j),将二者交换,重复上述操作直到i大于j。完整代码:void move(ElemType A[],int len){ int i = 0; //i表示左端偶数元素的下标 int j = len - 1; //j表示右端奇数元素的下标原创 2022-04-26 10:22:01 · 1787 阅读 · 0 评论 -
考研数据结构(每日一题)day49
考研数据结构(每日一题)题目:编写双向冒泡排序算法,在正反两个方向交替进行扫描,即第一趟把关键字最大的元素放在序列的最后面,第二趟把关键字最小的元素放在序列的最前面,如此反复进行。算法思想:奇数趟时,从前向后比较相邻元素的关键字,遇到逆序即交换,直到把序列中关键字最大的元素移动到序列尾部。偶数趟时,从后往前比较相邻元素的关键字,遇到逆序即交换,直到把序列中关键字最小的元素移动到序列前端。完整代码:void BubbleSort(ElemType A[],int n){ int l原创 2022-04-25 09:21:15 · 409 阅读 · 0 评论 -
考研数据结构(每日一题)day48
考研数据结构(每日一题)题目:编写一个递归算法,在一棵有n个结点的、随机建立起来的二叉排序树上查找第k(1<=k<=n)小的元素,并返回指向该结点的指针。要求算法的平均时间复杂度为O(log2n),二叉排序树的每个结点中除data,lchild,rchild等数据成员外,增加一个count成员,保存以该结点为根的子树上的结点个数。算法思想:设二叉排序树的根结点为*t,根据结点存储的信息,有以下几种情况:t->lchild为空时若t->rchild非空且k==1,则*t原创 2022-04-24 10:44:58 · 599 阅读 · 0 评论 -
考研数据结构(每日一题)day47
考研数据结构(每日一题)题目:设计一个算法,求出给定二叉排序树中最小和最大的关键字设计一个算法,从大到小输出二叉排序树中所有值不小于k的关键字算法思想:在二叉排序树中,最左下结点即为关键字最小的结点,最右下结点即为关键字最大的结点。本算法只要找出这两个结点即可,不需要比较关键字。由二叉树排序树的性质可知,右子树中所有的结点值均大于根结点值,左子树中所有的结点值均小于根结点值。为了从大到小输出,先遍历右子树,在访问根结点,后遍历右子树。完整代码:KeyType MinKey(BST原创 2022-04-22 09:30:50 · 929 阅读 · 0 评论 -
考研数据结构(每日一题)day46
考研数据结构(每日一题)题目:判断二叉树是否是平衡二叉树的算法。算法思想:设二叉树的平衡标记为balance,以标记返回二叉树bt是否为平衡二叉树,若为平衡二叉树,则返回1,否则返回0,h为二叉树bt 的高度,采用后序遍历递归算法。若bt为空,则高度为0,balance=1若bt仅有根结点,则高度为1,balanc=1否则,对bt的左右子树进行递归,返回左右子树的高度和平衡标记,bt的高度为最高子树的高度加1若左右子树的高度差大于1,则balance=0若左右子树的高度差小原创 2022-04-21 14:20:35 · 167 阅读 · 0 评论 -
考研数据结构(每日一题)day45
考研数据结构(每日一题)题目:设计一个算法,求出指定结点在给定二叉排序树中的层次。算法思想:二叉树采用二叉链表存储。在二叉排序树中,查找一次就下降一层。查找该结点所用的次数就是该结点在二叉排序树中的层次。采用二叉排序树非递归查找算法,用n保存查找层次,每查找一次,n就加一,直到找到相应的结点。完整代码:int level(BiTree bt,BSTNode *p){ int n = 0; //统计查找次数 BiTree t = bt; if (bt != NULL原创 2022-04-20 09:38:54 · 465 阅读 · 0 评论 -
考研数据结构(每日一题)day44
考研数据结构(每日一题)题目:判断给定的二叉树是否是二叉排序树。算法思想:在二叉排序树来说,其中序遍历序列为一个递增有序序列。二叉树进行中序遍历,若始终能保持前一个值比后一个值小,则说明该二叉树是一棵二叉排序树。完整代码:KeyType predt = -987654; //predt为全局变量,保存当前结点中序前驱的值,初始值为负无穷大int JudgeBST(BiTree bt){ int b1,b2; if(bt == NULL){ //空树 ret原创 2022-04-19 09:57:56 · 477 阅读 · 0 评论 -
考研数据结构(每日一题)day43
考研数据结构(每日一题)题目:折半查找的递归算法。初始调用时。low为1,high为ST.length。算法思想:根据查找的起始位置和终止位置,将查找序列一分为二,判断所查找的关键字在哪一部分,然后用新的序列的起始位置和终止位置递归求解。完整代码:typedef struct{ //查找表的数据结构 ElemType *elem; //存储空间地址,建表时按实际长度分配,0号留空 int length; //表的长度}SSTable;int BinSearchRe原创 2022-04-18 09:23:35 · 975 阅读 · 0 评论 -
考研数据结构(每日一题)day42
考研数据结构(每日一题)题目:已知无向连通图G由顶点集V和遍集E组成,|E|>0,当G中度为奇数的顶点个数为不大于2的偶数时,G存在包含所有边且长度为|E|的路径(称为EL路径)。设图G采用邻接矩阵存储。请设计算法 int IsExistEL(MGraph G),判断G是否存在EL路径,若存在,则返回0。算法思想:采用邻接矩阵存储无向图,在邻接矩阵的每一行(列)中,非零元素的个数为本行(列)对应的顶点的度。可以依次计算连通图G中各顶点的度,并记录度为奇数的顶点个数,若个数为0或2,则返回1,否则原创 2022-04-15 11:26:14 · 2068 阅读 · 0 评论 -
考研数据结构(每日一题)day41
考研数据结构(每日一题)题目:设计一个算法,将给定的表达式树(二叉树)转换为等价的中缀表达式(通过括号反映操作符的计算次序)并输出。例如,当下列两棵表达式树作为算法的输入时:输出的等价中缀表达式分别为(a+b)*(c*(-d))和(a*b)+(-(c-d))算法思想:表达式树的中序序列加上必要的括号即为等价的中缀表达式。表达式树中分支结点所对应的子表达式的计算次序,由该分支结点所处的位置决定。需要在生成遍历序列的同时,在适当位置增加必要的括号。表达式的最外层(对应根结点)和操作数(对应叶结点)原创 2022-04-14 11:13:13 · 1351 阅读 · 0 评论 -
考研数据结构(每日一题)day40
考研数据结构(每日一题)题目:二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和,给定一棵二叉树T,采用二叉链表存储,结点结构为(left,weight,right),其中叶结点的weight域保存该结点的非负权值,设root为指向T的根结点的指针,请设计求T的WPL的算法。算法思想:二叉树的带权路径长度为每个叶结点的深度与权值之和的总和,可以使用先序遍历或层次遍历。先序遍历使用一个static变量记录wpl,把每个结点的深度作为递归函数的一个参数传递。若该结点是叶结点,则变量原创 2022-04-13 15:52:49 · 210 阅读 · 0 评论 -
考研数据结构(每日一题)day39
考研数据结构(每日一题)题目:写出在中序线索二叉树里查找指定结点在后序的前驱结点的算法。算法思想:在后序序列中:若结点p有右子女,则右子女是前驱若无右子女而有左子女,则左子女是前驱若结点p左右都无子女,设其中序左线索指向某祖先结点f(p是f右子树种按中序遍历的第一个结点)若f有左子女,则其左子女是结点p在后序下的前驱若f无左子女,则顺其前驱找双亲的双亲,一直找到双亲有左子女(这时左子女是p的前驱)若p是中序遍历的第一个结点,则结点p在中序和后序下都无前驱完整代码:原创 2022-04-12 11:44:30 · 327 阅读 · 0 评论 -
考研数据结构(每日一题)day38
考研数据结构(每日一题)题目:试设计判断两棵二叉树是否相似的算法。所谓二叉树T1和T2相似,指的是T1和T2都是空的二叉树或都只有一个根结点,或T1的左子树和T2的左子树是相似的,且T1的右子树和T2的右子树是相似的。算法思想:采用递归的思想。若T1和T2都是空树,则相似;若有一个为空另一个不为空,则不相似;递归的比较它们的左右子树是否相似。f(T1,T2) = 1; T1== T2 == NULLf(T1,T2) = 0; T1和T2其中一个为NULL,另一个不为NUL原创 2022-04-11 09:30:00 · 1187 阅读 · 0 评论 -
考研数据结构(每日一题)day37
考研数据结构(每日一题)题目:设计一个算法将二叉树的叶结点按从左到右的顺序连成一个单链表,表头指针为head,二叉树按二叉链表方式存储,链接时用叶结点的右指针域来存放单链表指针。算法思想:采用中序递归遍历。设置前驱结点指针pre,初识为空。第一个叶结点由指针head指向,遍历至叶结点时,将它前驱的rchild指针指向它,最后一个叶结点的rchild为空。完整代码:LinkedList head,pre = NULL; //设置全局变量LinkedList InOrder(BiTree b原创 2022-04-08 09:43:59 · 2246 阅读 · 0 评论 -
考研数据结构(每日一题)day36
考研数据结构(每日一题)题目:设有一棵满二叉树(所有结点值均不同),已知其先序序列为pre,求其后序序列post。算法图解:算法思想:对于一般二叉树,仅仅根据先序或后序序列是不能确定另一个遍历序列。但对于满二叉树,任意一个结点的左右子树均有相同的结点数。先序序列的第一个结点是后序序列的最后一个结点,由此可以得出先序序列pre[l1…h1]转化为后序序列post[l2…h2],运用递归,可得出递归模型为:f(pre,l1,h1,post,l2,h2) = 不做任何事 h1<l1时原创 2022-04-07 10:14:38 · 789 阅读 · 0 评论 -
考研数据结构(每日一题)day35
考研数据结构(每日一题)题目:假设二叉树采用二叉链表存储结构,求非空二叉树b的宽度(即具有结点数最多的那一层的结点个数)算法思想:采用层次遍历的方法。首先求出所有结点的层次,将所有结点和对应的层次放在一个队列中。然后依次扫描队列,并求出各层的结点总数,最大的层结点总数即为二叉树的宽度。完整代码:typedef struct{ BiTree data[MaxSize]; //保存队列中的结点指针 int level[MaxSize]; //保存data中相同下标结点的层次原创 2022-04-06 14:20:51 · 491 阅读 · 0 评论 -
考研数据结构(每日一题)day34
考研数据结构(每日一题)题目:设一棵二叉树的结点结构为(LLINK,INFO,RLINK),ROOT为指向该二叉树根结点的指针,p和q分别指向该二叉树中任意两个结点的指针,试编写算法ANCESTOR(ROOT,p,q,r)找到p和q的最近公共祖先结点r。算法思想:这道题的目的是了解后序遍历的特性,在遍历中,栈内元素都是当前元素的直系祖先。栈存在是意义:访问到了,但是还没有轮到它输出,因为顺序是左右根,它是根,所以现在还不能输出,入栈了,接下来访问它的左右孩子。采用后序非递归算法,栈中存放二叉树结点的原创 2022-04-02 10:07:20 · 354 阅读 · 0 评论 -
考研数据结构(每日一题)day33
考研数据结构(每日一题)题目:在二叉树中查找值为x的结点,编写算法打印值为x的结点的所有祖先,假设值为x的结点不多于一个。算法思想:采用非递归后序遍历,最后访问根结点,访问到值为x的结点时,栈中所有元素均为结点的祖先,依次出栈打印即可。完整代码:typedef struct{ BiTree t; int tag;}stack; //tag=0表示左子女被访问,tag=1表示右子女被访问void Search(BiTree bt,ElemType x){ stack s原创 2022-04-01 11:11:48 · 1344 阅读 · 0 评论 -
考研数据结构(每日一题)day32
考研数据结构(每日一题)题目:已知二叉树以儿茶链表存储,编写算法完成:对于树中每个元素值为x的结点,删去以它为根的子树,并释放相应的空间。算法思想:采用递归后序遍历。删除值为x的结点,将其父节点的左(右)子树指针置空,用层次遍历找到某结点的父节点完整代码://递归void Del_all(BiTree &T,char x){ if(T == NULL){ return; } if(T -> data == x){ Del原创 2022-03-31 11:15:38 · 770 阅读 · 0 评论 -
考研数据结构(每日一题)day31
考研数据结构(每日一题)题目:假设二叉树采用二叉链存储结构存储,设计一个算法,求先序遍历序列中第k(1<=k<=二叉树中结点个数)个结点的值算法思想:设置一个全局变量i(初始值为1)来表示进行先序遍历先用先序遍历二叉树,当二叉树b为空时,返回特殊字符‘#’当k==i时,即为要找的结点,返回b->data当k不等于i时,递归在左子树中查找,若找到则返回该值,否则继续递归在右子树中继续查找,并返回其结果完整代码:int i = 1; //全局变量ElemType Pr原创 2022-03-30 10:23:42 · 1533 阅读 · 0 评论 -
考研数据结构(每日一题)day30
考研数据结构(每日一题)题目:设树B是一棵采用链式结构存储的二叉树,编写一个把树B中所有结点的左右子树进行交换的函数。算法图解:算法思想:递归的交换左右子树。先交换b结点左孩子的左右子树,然后交换b结点的右孩子的左右子树,最后交换b结点的左右孩子,当结点为空时递归结束。完整代码:void swap(BiTree b){ if(b){ swap(b -> lchild); //递归交换左子树 swap(b -> rchild);原创 2022-03-29 09:32:45 · 1533 阅读 · 0 评论 -
考研数据结构(每日一题)day29
考研数据结构(每日一题)题目:假设二叉树采用二叉链表存储结构存储,试设计一个算法,计算一棵给定二叉树的所有双分支(度为2)结点个数。算法思想:用递归,设置递归函数模型f(b):f(b)=0 为空结点f(b)=f(b->lchild)+f(b->rchild)+1 是双分支结点,+1是本身f(b)=f(b->lchild)+f(b->rchild) 不是双分支结点完整代码:int DoubleNodes(BiTree b){ if(b == NULL)原创 2022-03-28 11:17:18 · 695 阅读 · 0 评论 -
考研数据结构(每日一题)day28
考研数据结构(每日一题)题目:二叉树按二叉链表形式存储,写一个判别给定二叉树是否是完全二叉树的算法。算法思想:完全二叉树定义:一棵深度为k的有n个结点的二叉树对树中的结点按从上至下、从左到右的顺序进行编号,如果编号为i(1≤i≤n)的结点与满二叉树中编号为i的结点在二叉树中的位置相同,则这棵二叉树称为完全二叉树。采用层次遍历,将所有结点加入队列(包括空结点)。遇到空结点时,查看其后是否有费控结点,若有则二叉树不是完全二叉树。完整代码:bool IsComplete(BiTree T){原创 2022-03-25 14:16:50 · 491 阅读 · 0 评论 -
考研数据结构(每日一题)day27
考研数据结构(每日一题)题目:假设二叉树采用二叉链表存储结构,设计一个算法求二叉树的高度(递归和非递归)算法思想:递归:递归求左子树高度、右子树高度,取较大者+1非递归:采用层次遍历算法,变量level记录二叉树层数,指针last指向最右结点,每次层次遍历出队时与last指针比较,若两者相等,则层数加1,并让last指向下一层的最右结点,直到遍历完成。level的值即为二叉树的高度。完整代码://递归int Btdepth(Bitree T){ if(T == NULL){ //原创 2022-03-23 17:11:25 · 1416 阅读 · 0 评论 -
考研数据结构(每日一题)day26
考研数据结构(每日一题)题目:设有两个栈s1、s2都采用顺序栈方式,并共享一个存储区[0,…,maxsize-1],为了尽量利用空间,减少溢出的可能,可采用栈顶相向、迎面增长的存储方式。试设计s1、s2有关入栈和出栈的操作算法。算法图解:算法思想:此题的关键在于,两个栈入栈和退栈时的栈顶指针的计算。s1栈是通常意义下的栈;而s2栈入栈操作时,其栈顶指针左移(减1),退栈时,栈顶指针右移(加1)。两个栈共享向量空间,将两个栈的栈底设在向量两端,初始时,s1栈顶指针为-1,s2栈顶指针为maxsiz原创 2022-03-22 11:33:44 · 1639 阅读 · 0 评论 -
考研数据结构(每日一题)day25
考研数据结构(每日一题)题目:设单链表的表头指针为L,结点结构由data和next两个域构成,其中data域为字符型,试设计算法判断该链表的全部n个字符是否中心对称,例如xyx、xyyx都是中心对称。算法思想:此题可以用栈来判断数据是否中心对称。1.首先让链表的前一半元素依次进栈,当n为偶数时,前一半和后一半的个数相同;当n为奇数时,链表中心结点字符不比较,移动链表指针到下一字符开始比较2.处理链表的后一半元素时,访问链表的一个元素后就从栈中弹出一个元素3.两个元素进行比较,若相等,则将链表中的原创 2022-03-21 10:51:50 · 1736 阅读 · 0 评论 -
考研数据结构(每日一题)day24
考研数据结构(每日一题)题目:用单链表保存m个整数,结点的结构为[data][link],且|data|<=n(n为正整数),要求设计一个时间复杂度尽可能高效的算法,对于链表中data的绝对值相等的结点,仅保留第一次出现的结点而删除其余绝对值相等的结点。例如,若给定的单链表head如下:则删除结点后的head为:算法思想:核心思想是用空间换时间。使用辅助数组记录链表中已出现的数值,只需对链表进行一趟扫描。|data|<=n,所以辅助数组q的大小为n+1,各元素的初始值为0,一次扫描原创 2022-03-18 11:58:05 · 1202 阅读 · 2 评论 -
考研数据结构(每日一题)day23
考研数据结构(每日一题)题目:设线性表L=(a1,a2,a3,…,an-2,an-1,an)采用带头结点的单链表保存,请设计一个空间复杂度为O(1)且时间上尽可能高效的算法,重新排列L中的各节点,得到线性表L’=(a1,an,a2,an-1,a3,an-2,…)算法图解:算法思想:L’是由L取第一个元素,再取倒数第一个元素,以此类推,依次合并而成的。为了方便链表后半段取元素,需要先将L后半段原地逆置(如图红色方框部分),题目中要求空间复杂度为O(1),即不能用栈,否则每取最后一个结点都需要遍历一次原创 2022-03-18 09:55:26 · 729 阅读 · 0 评论 -
考研数据结构(每日一题)day22
考研数据结构(每日一题)题目:假定采用带头结点的单链表保存单词,当两个单词有相同的后缀时,可共享相同的后缀存储空间,例如,“loading”和“being”的存储映像如下图:设str1和str2分半指向两个单词所在单链表的头结点,链表结点结构为请设计一个时间上尽可能高效的算法,找出由str1和str2所指向两个链表共同后缀的起始位置(如图中字符i所在结点的位置p)算法思想:采用双指针法。用指针p、q分别扫描str1和str2,当p、q指向同一个地址时。即可找到共同后缀的起始位置。注意:这个题目原创 2022-03-16 11:39:55 · 1465 阅读 · 0 评论