针对考研的C语言学习(2019链表大题)

ops/2024/12/23 6:09:04/

题目解析:

【考】双指针算法,逆置法,归并法。

解析:因为题目要求空间复杂度为O(1),即不能再开辟一条链表,因此我们只能用变量来整体挪动原链表。

第一步先找出中间节点

typedef NODE* Node;
Node find_mid(Node& h)
{Node pre, cur;pre = h->next;cur = pre;while (cur){cur = cur->next;if (!cur) break;cur = cur->next;if (!cur) break;pre = pre->next;}Node l2 = (Node)malloc(sizeof(NODE));l2->next = pre->next;pre->next = NULL;return l2;
}

第二步:把找出的中间节点之后的组成的新链表原地逆置

void reverse_list(Node& l)
{Node s, r, t;s = l->next, r = s->next, t = r->next;s->next = NULL;while (t){r->next = s;s = r;r = t;t = t->next;}r->next = s;l->next = r;
}

第三步:合并链表

void merge_list(Node& l1, Node& l2)
{Node a =  l1->next, b = l2->next;Node acur = a;a = a->next;while (a && b){acur->next = b;b = b->next;acur = acur->next;acur->next = a;a = a->next;acur = acur->next;}if(!a) acur->next = b;}

【注】以上三步核心算法即为笔试时写的答案

为了让读者看清正确性,我写出完整能运行的代码供参考

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode {ElemType data;struct LNode* next;
}NODE;
typedef NODE* Node;void insert_head_list(Node& l)
{ElemType data = 0;scanf("%d", &data);while (data != 9999){Node tmp = (Node)malloc(sizeof(NODE));tmp->data = data;tmp->next = l->next;l->next = tmp;scanf("%d", &data);}
}void print_list(Node& l)
{Node cur = l->next;while (cur){printf("%d ", cur->data);cur = cur->next;}printf("\n");
}Node find_mid(Node& h)
{Node pre, cur;pre = h->next;cur = pre;while (cur){cur = cur->next;if (!cur) break;cur = cur->next;if (!cur) break;pre = pre->next;}Node l2 = (Node)malloc(sizeof(NODE));l2->next = pre->next;pre->next = NULL;return l2;
}
void reverse_list(Node& l)
{Node s, r, t;s = l->next, r = s->next, t = r->next;s->next = NULL;while (t){r->next = s;s = r;r = t;t = t->next;}r->next = s;l->next = r;
}void merge_list(Node& l1, Node& l2)
{Node a =  l1->next, b = l2->next;Node acur = a;a = a->next;while (a && b){acur->next = b;b = b->next;acur = acur->next;acur->next = a;a = a->next;acur = acur->next;}if(!a) acur->next = b;}
int main()
{Node l = (Node)malloc(sizeof(NODE)); //存储头节点的头指针l->next = NULL;insert_head_list(l);//头插法print_list(l);Node l2 = find_mid(l);/*print_list(l);*/print_list(l2);reverse_list(l2);print_list(l2);merge_list(l, l2);print_list(l);return 0;
}

运行结果图片

链表长度为奇数时

链表长度为偶数时


http://www.ppmy.cn/ops/120151.html

相关文章

[JavaEE] HTTP/HTTPS

目录 一、HTTP 1.1 HTTP是什么 1.2 HTTP发展史 1.3 HTTP工作过程 1.3.1 抓包工具的原理 1.4 HTTP请求格式 1.4.1认识URL 1.5 HTTP响应格式 1.6 认识HTTP"方法"(method) 1.6.1 GET方法 1.6.2 POST方法 1.6.3 其他方法 1.7 GET 与 POST 的区别 1.8 认识…

Excel根据一个值匹配一行数据

根据一个值从一个表中匹配一行数据&#xff0c;例如从左边的表中找到指定姓名的所有行数据 使用VLOOKUP函数&#xff0c;参数&#xff1a; Lookup_value&#xff1a;需要搜索的值&#xff0c;单个值 Table_array&#xff1a;被搜索的区域&#xff0c;是个表 Col_index_num&…

8.使用 VSCode 过程中的英语积累 - Help 菜单(每一次重点积累 5 个单词)

前言 学习可以不局限于传统的书籍和课堂&#xff0c;各种生活的元素也都可以做为我们的学习对象&#xff0c;本文将利用 VSCode 页面上的各种英文元素来做英语的积累&#xff0c;如此做有 3 大利 这些软件在我们工作中是时时刻刻接触的&#xff0c;借此做英语积累再合适不过&a…

中间件:SpringBoot集成Redis

一.Redis简介 Redis&#xff08;Remote Dictionary Server&#xff0c;远程字典服务&#xff09;是一个开源的、使用ANSI C语言编写的、支持网络交互的、可基于内存亦可持久化的日志型Key-Value数据库&#xff0c;它提供了多种语言的API。Redis通常被称为数据结构服务器&#…

安宝特案例 | 某知名日系汽车制造厂,借助AR实现智慧化转型

案例介绍 在全球制造业加速数字化的背景下&#xff0c;工厂的生产管理与设备维护效率愈发重要。 某知名日系汽车制造厂当前面临着设备的实时监控、故障维护&#xff0c;以及跨地域的管理协作等挑战&#xff0c;由于场地分散和突发状况的不可预知性&#xff0c;传统方式已无法…

木舟0基础学习Java的第三十一天(SpringMVC,xml式和注解式开发,携带数据,取值,视图解析)

SpringMVC Mybatis: 优化了dao层 降低了java与dao层的耦合 Spring:是大管家 整合和管理mybatis与springmve(是spring中子模块) SpringMVC:优化了servlet层 降低了java与servlet的耦合 为什么要使用 springMVC? SpringMVC 是一种基于 Java&#xff0c;实现了 Web MVC 设计模…

吐槽一次qiankun微前端的框架

背景 心血来潮&#xff0c;想在自己的个人网站中体验一下微前端的魅力&#xff0c;其实也是为了满足我自己多个应用便于统一查看&#xff0c;而不需要跳来跳去的打开n多标签页&#xff0c; 不过微前端出来的主要目的&#xff1a;还是为了解决&#xff0c;真正使用中&#xff0…

Linux下的git开篇第一文:git的意义

目录 1.git版本控制器 2.git gitee&&github 3.Linux中gitee的使用 &#xff08; 三板斧 git add git commit -m " " git push &#xff09; 4.git log 查看之前的修改信息 &#xff08;所有提交日志&#xff09; 5.git status 查看工作目录与本地…