![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
链表
csdner1998
这个作者很懒,什么都没留下…
展开
-
lesson 21 按递增次序输出单链表中各结点的数据元素,并释放结点所占的存储空间
思路:套用删除最小值的模版,加一个输出语句即可。代码:void increasePrint(LNode* &L){ while(L->next){//循环到只剩头结点,别忘了这句!!! LNode *p=L->next,*pre=L; LNode *minp=p,*minpre=pre; while(p){ if(p->data<minp->data){原创 2020-09-29 07:34:08 · 1112 阅读 · 0 评论 -
lesson20 有一个带头结点的单链表L,设计一个算法使其元素递增有序。
思想:直接插入排序算法代码:void sort(LinkList * &L){ LinkList *p,*pre,*r; p = L->next->next; // 先保存下L的第二个元素,因为下一步要将L变成只有一个元素的有序表; p指针用来遍历无序区 L->next->next = NULL; // 将L变成只有一个元素的有序表 // 从L的第二个元素开始遍历整个L直至表尾 while(p != NULL){ r = p->next原创 2020-09-27 22:36:14 · 3813 阅读 · 0 评论 -
lesson19-2 《数据结构与算法》P35Q36拆分单链表
题目描述:编写算法将单链表L1拆成两个表,其中以L1为头的链表保持原来向后的链接,另一个以L2为头的链表,其链接方向与L1相反,L1包含原链表的奇数序号结点,L2包含原链表的偶数序号结点。思路:对一个链表进行部分逆置或其他操作时,可以用 i 来保存结点的序号,更简便。代码:void breakList(LNode *L1){ int i=0;//i表示结点序号 LNode *L2=new LNode();//L2为偶数序号链表,L1为奇序号链表 L2->next=NULL;原创 2020-08-23 19:45:46 · 818 阅读 · 0 评论 -
lesson18-2 《数据结构与算法》P37Q58
题目描述:设有一个正整数序列组成的有序单链表(按递增次序有序),完成下列功能。(要求用最少的时间和最小的空间)(1)确定在序列中比正整数x大的数有几个,相同的数只计算一次。(2)在单链表中将比正整数x小的数按递减次序排列(3)将比正整数x大的偶数从单链表中删除。...原创 2020-08-21 22:12:28 · 790 阅读 · 0 评论 -
lesson17-2 《数据结构与算法》P37Q55
题目描述:设有一个由正整数组成的无序(向后)单链表,编写完成下列功能的算法:(1)找出最小值结点,且打印该数值。(2)若该数值是奇数,则将其与直接后继结点的数值交换。(3)若该数值是偶数,则将其直接后继结点删除。代码:void swapOrDelete_(LNode *L){//函数分解思想 LNode* min=findMinNode(L);//不知道最小值data是哪个节点 => 我去拿这个节点=>函数要返回一个结点的指针 if(min==NULL){ co原创 2020-08-21 19:11:53 · 753 阅读 · 0 评论 -
lesson15-2 实现一种算法,删除单向链表中间的某个节点(即不是第一个或最后一个节点),假定只能访问该节点。
思路:在无法得到前驱结点的情况下删除某个指定结点,将后继结点的值赋给要删除的结点,然后删除这个后继元素即可。这也是一种删除方法,但用的少。代码:void deleteNode(LNode*&p){//待删除结点p LNode *q=p->next; p->data=q->data; p->next=q->next; free(q);}测试:#include<stdio.h>#include <stdlib.h&g原创 2020-08-14 18:48:58 · 432 阅读 · 0 评论 -
lesson 14-2 单链表查找倒数第k个结点
题目描述:已知一个带有表头结点的单链表,结点结构为(data,link),假设该链表只给出了头指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第k个位置上的结点。若查找成功,算法输出该结点的data域的值,并返回1;否则,只返回0.思路:定义两个指针p和q,指针p用来遍历整个链表,指针q刚开始指向链表第一个元素;当p走了k-1步后,q开始走,当p走到表尾时,p所指的恰为倒数第k个结点。代码:int getNode(LNode *list,int k){原创 2020-08-13 16:38:20 · 210 阅读 · 0 评论 -
lesson11-2 设计一个算法,可以删除单链表中所有值为x的结点
思路1:假设单链表带头结点,尾插法新建一个单链表,将值不等于x的元素存放在其中。代码1:void delAllSame(LNode *&L,int x){//用尾插法建立一个新的单链表,将值不为x的元素链接到表尾 LNode *p=L->next,*r=L,*q;//假设单链表带头结点,p指针用来扫描整个链表,r指针初值为头结点,之后始终指向表尾 while(p){ if(p->data!=x){ r->next=p; r=p; p=p-&g原创 2020-08-07 22:47:47 · 3294 阅读 · 0 评论 -
lesson10-2 删除单链表中值为x的结点
题目:链表L中可能存在一个值为x的结点,设计一个函数,删除这个可能存在的结点。代码:void searchAnddelete(LNode *L,int x){//假设单链表带头结点 LNode *pre=L,*p=L->next,*q; while(p){ if(p->data==x){ q=p; p=p->next; pre->next=p; free(q); } else{ pre=p; p=p->next原创 2020-08-13 17:16:16 · 988 阅读 · 0 评论 -
lesson9-2 设计一个函数,将单链表的最大元素放置到链表表头(带头结点)
思想:本质是一个查找,删除和插入的问题用p从头至尾扫描单链表,pre指向*p的前驱;用max保存值最大的结点,maxpre指向max结点的前驱(用来保存max结点的前驱结点);一边扫描一边比较。void moveMaxNode(LNode *L){ LNode *pre=L,*p=pre->next,*max=p,*maxpre=pre; while(p){ if(p->data>max->data){ max=p; maxpre=pre; .原创 2020-08-07 22:49:25 · 399 阅读 · 0 评论 -
lesson8-2 设计一个函数,可以判断链表B是不是链表A的子集
思路:两个链表都从第一个结点开始,如果对应数据相等,同时后移指针,直至到B链表表尾。如果对应元素不相等,A链表从上次比较结点后续开始继续遍历,B链表从第一个节点开始。A链表到表尾,B链表没到尾表示B链表不是A链表的子集,反之。代码:bool pattern(LNode *A,LNode *B){//考虑头结点问题 LNode *p=A; LNode *pre=p; LNode *q=B; while(p&&q){ if(p->data==q-&.原创 2020-08-13 17:27:41 · 671 阅读 · 0 评论 -
lesson7-2 有一个表头为first的单链表,设计一个算法,通过遍历一趟链表,将链表中所有结点按逆序链接
思路:头插法建立一个新表。*表头为first就是链表的第一个结点,无论这个单链表带不带头结点。代码:void reverse(LNode *first){//不妨令链表带头结点 LNode *p=first->next; LNode *q=p->next; first->next=NULL; while(p){ p->next=first->next; first->next=p; p=q; if(q) q=q->ne原创 2020-08-13 17:34:38 · 1646 阅读 · 0 评论 -
lesson6-2 设计一个函数,可以取出链表A和链表B的公共元素
思路:两次循环,先去遍历链表A中的每个元素,然后拿这个元素去遍历链表B,如果相同,就插入链表C中代码:void getIntersection(LNode *A,LNode *B,LNode *&C){//不妨设数据元素类型为int //1.创建头结点 C=(LNode*)malloc(sizeof(LNode)); C->next=NULL; //2.p是用来遍历链表A,t是用来记录C链表的末尾 LNode *p,*t; t=C; p=A->ne.原创 2020-08-13 18:48:49 · 135 阅读 · 0 评论 -
lesson5-2 设计一个函数,可以将两个有序的单链表归并成一个有序的单链表
.原创 2020-08-13 18:52:28 · 229 阅读 · 0 评论 -
lesson3-2 设计一个函数可以删除单链表(带头结点)的最小值结点
.原创 2020-08-13 18:54:02 · 330 阅读 · 0 评论