C语言.数据结构.单链表经典算法

数据结构.单链表经典算法

  • 1.经典算法OJ题1:移除链表元素
    • 1.1题目描述:
    • 1.2题解:
    • 1.3图文解释:
  • 2.经典算法OJ题2:反转链表
    • 2.1题目描述:
    • 2.2题解:
    • 2.3图文解释
  • 3.经典算法OJ题3:合并两个有序链表
    • 3.1题目描述:
    • 3.2题解:
    • 3.3图文解释
  • 4.经典算法OJ题4:链表的中间节点
    • 4.1题目描述:
    • 4.2题解:
    • 4.3图文解释
  • 5.经典算法OJ题5:环形链表的约瑟夫问题
    • 5.1题目描述:
    • 5.2题解:
    • 5.3图文解释
  • 6.经典算法OJ题6:分割链表
    • 6.1题目描述:
    • 6.2题解:
    • 6.3图文解释

1.经典算法OJ题1:移除链表元素

题目:移除链表元素

1.1题目描述:

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回 新的头节点 。

在这里插入图片描述
在这里插入图片描述

1.2题解:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* removeElements(struct ListNode* head, int val) {//创建一个新的空链表来装不为val节点:ListNode* newhead = NULL;ListNode* newtail = NULL;ListNode* pcur = head;//找不为val值的节点尾插在空链表中while(pcur) {if(pcur->val != val) {//情况一:链表为空if(newhead == NULL) {newhead = newtail = pcur;}else{//链表不为空:newtail->next = pcur;newtail = newtail->next;}}pcur = pcur->next;}if(newtail) {newtail->next = NULL;}return newhead;
}

1.3图文解释:

在这里插入图片描述

2.经典算法OJ题2:反转链表

题目:反转链表

2.1题目描述:

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

在这里插入图片描述
在这里插入图片描述

2.2题解:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* reverseList(struct ListNode* head) {//判断单链表是否为空:if(head == NULL) {return head;}//开始反转:ListNode* n1 = NULL;ListNode* n2 = head;ListNode* n3 = head->next;//遍历单链表:while(n2) {//发生反转:改变指针指向n2->next = n1;n1 = n2;n2 = n3;if(n3) {n3 = n3->next;}}return n1;
}

2.3图文解释

在这里插入图片描述

3.经典算法OJ题3:合并两个有序链表

题目:合并两个有序链表

3.1题目描述:

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

在这里插入图片描述
在这里插入图片描述

3.2题解:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2) {//判断两个链表是否有空链表出现:if(list1 == NULL){//证明只有list2存在并且list2本身就是有序的,所以不用合并了return list2;}if(list2 == NULL){return list1;}//创建一个带哨兵位的链表,节省判新链表是否为空ListNode* newhead, *newtail;newhead = newtail = (ListNode*)malloc(sizeof(ListNode));ListNode* l1 = list1;ListNode* l2 = list2;//开始合并:while(l1 && l2){if(l1->val > l2->val)//哪个节点小,哪个节点就先排序{newtail->next = l2;newtail = newtail->next;//l2也得往下走l2 = l2->next;}else{newtail->next = l1;newtail = newtail->next;l1 = l1->next;}}//走到这 就会有指针越界访问了,但是还没有把所有的节点尾插在新链表中if(l1){newtail->next = l1;}if(l2){newtail->next = l2;}//哨兵位 什么都不表示,有效位置为哨兵位的下一个位置ListNode* ret = newhead->next;//把哨兵位内存空间释放掉free(newhead);newhead = NULL;return ret;
}

3.3图文解释

在这里插入图片描述

4.经典算法OJ题4:链表的中间节点

题目:链表的中间节点

4.1题目描述:

  • 给你单链表的头结点 head ,请你找出并返回链表的中间结点。
  • 如果有两个中间结点,则返回第二个中间结点。

在这里插入图片描述
在这里插入图片描述

4.2题解:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/typedef struct ListNode ListNode;
struct ListNode* middleNode(struct ListNode* head) {//定义两个快慢指针:ListNode* slow = head;ListNode* fast = head;while(fast && fast->next){//slow走一步,fast就走两步(一个快,一个慢)slow = slow->next;fast = fast->next->next;}//走到这里 正好slow指向了链表的中间位置,两种情况都成立return slow;
}

4.3图文解释

在这里插入图片描述

5.经典算法OJ题5:环形链表的约瑟夫问题

题目:环形链表的约瑟夫问题

  • 著名的Josephus问题
    据说著名犹太 Josephus有过以下的故事:在罗马人占领乔塔帕特后,39 个犹太人与Josephus及他的朋友躲到一个洞中,39个犹太人决定宁愿死也不要被人抓到,于是决定了一个自杀方式,41个人排成一个圆圈,由第1个人开始报数,每报数到第3人该人就必须人杀,然后再由下一个重新报数,直到所有人都自杀身亡为止。
    然而Josephus 和他的朋友并不想遵从,Josephus要他的朋友先假装遵从,他将朋友与自己安排在第16个与第31个位置,于是逃过了这场死亡游戏。

5.1题目描述:

  • 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。
    下一个人继续从 1 开始报数。
    n-1 轮结束以后,只剩下一个人,问最后留下的这个人编号是多少?
  • 数据范围:
    1 ≤𝑛, 𝑚≤10000
    进阶:空间复杂度 𝑂(1),时间复杂度 𝑂(𝑛)

在这里插入图片描述在这里插入图片描述

5.2题解:

/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可** * @param n int整型 * @param m int整型 * @return int整型*/typedef struct ListNode ListNode;//创建节点:ListNode* buyNode(int x){ListNode* node = (ListNode*)malloc(sizeof(ListNode));//看申请空间是否失败:if(node == NULL){exit(1);//假如申请失败,直接退出程序}node->val = x;node->next = NULL;//返回结点的指针return node;}//创建带环链表:ListNode* createCircle(int n){//先创建一个节点,再串联起来ListNode* phead = buyNode(1);ListNode* ptail = phead;for (int i = 2; i <= n; i++)//n = 5, 再创建4个节点就行了{ptail->next = buyNode(i);//新增一个节点,此时ptail不为尾节点,ptail需往后走,再成为尾节点 ptail = ptail->next;}//首尾相连,变成带环链表ptail->next = phead;return ptail;}
int ysf(int n, int m ) {//1.根据n的大小,创建带环链表ListNode* prev = createCircle(n);ListNode* pcur = prev->next;//数到2就退出int count = 1;while(pcur->next != pcur){//数到2,就销毁此节点if(count == m){prev->next = pcur->next;//销毁pcur节点free(pcur);pcur = prev->next;//销毁pcur节点完之后,计数count的下一个又重新变成了1count = 1;}else{//此处不需要销毁节点,让prev指针走到pcur的位置即可prev = pcur;pcur = pcur->next;count++;}}//此时剩下的一个节点一定是要返回的节点的值return pcur->val;
}

5.3图文解释

在这里插入图片描述

6.经典算法OJ题6:分割链表

题目:分割链表

6.1题目描述:

  • 给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。
  • 你不需要 保留 每个分区中各节点的初始相对位置。

在这里插入图片描述
在这里插入图片描述

6.2题解:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x) {// 假如链表为空,就不用分割了if (head == NULL) {return head;}// 创建两个带哨兵位链表:大链表和小链表ListNode *lesshead, *lesstail;ListNode *greaterhead, *greatertail;lesshead = lesstail = (ListNode*)malloc(sizeof(ListNode));greaterhead = greatertail = (ListNode*)malloc(sizeof(ListNode));ListNode* pcur = head;// 遍历原链表:while (pcur) {if (pcur->val < x) {// 把pcur尾插在小链表的尾节点上lesstail->next = pcur;// 尾节点向下挪动一位,重新变成新的尾节点lesstail = lesstail->next;} else {// 把pcur尾插在大链表的尾节点上greatertail->next = pcur;greatertail = greatertail->next;}pcur = pcur->next;}// 避免死循环,得手动改变 第5节点的下一个节点(本身还是指向2节点的)指向NULLgreatertail->next = NULL;// 把小链表的尾节点的下一个节点指向大链表的第一个有效节点,变成一个新的链表lesstail->next = greaterhead->next;return lesshead->next;
}

6.3图文解释

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/847825.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编译和运行qemu-uboot-arm64单板的Armbian系统

这篇文章ARM虚拟机安装OMV-CSDN博客遗留一个启动qemu-uboot-arm64单板Armbian镜像的问题&#xff0c;使用官方下载的镜像&#xff0c;会报错&#xff1a; fatal: no kernel available .... Failed to load /vmlinuz ...... qemu-system-aarch64 -smp 8 -m 8G -machine virt …

WPF音乐播放器 零基础4个小时左右

前言&#xff1a;winfrom转wpf用久的熟手说得最多的是,转回去做winfrom难。。当时不明白。。做一个就知道了。 WPF音乐播放器 入口主程序 FontFamily"Microsoft YaHei" FontSize"12" FontWeight"ExtraLight" 居中显示WindowStartupLocation&quo…

数据结构:并查集

数据结构&#xff1a;并查集 题目描述参考代码 题目描述 输入样例 5 5 C 1 2 Q1 1 2 Q2 1 C 2 5 Q2 5输出样例 Yes 2 3参考代码 #include <iostream>using namespace std;const int N 100010;int n, m; int p[N], sz[N];int find(int x) // 返回x的祖宗节点 路径…

山东大学软件学院项目实训-创新实训-基于大模型的旅游平台(二十六)- 微服务(6)

目录 10. Docker 10.1 Docker基本操作 10.1.1 镜像相关命令 10.1.2 容器相关命令 10.2 数据卷命令 10.2.1 常用命令 : 10.2.2 挂载数据卷 10. Docker 10.1 Docker基本操作 10.1.1 镜像相关命令 docker --help 查看docker帮助文档 docker images --help 查看docker ima…

Java中条件运算符的嵌套使用技巧总结

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

c语言项目-贪吃蛇项目2-游戏的设计与分析

文章目录 前言游戏的设计与分析地图&#xff1a;这里简述一下c语言的国际化特性相关的知识<locale.h> 本地化头文件类项setlocale函数 上面我们讲到需要打印★&#xff0c;●&#xff0c;□三个宽字符找到这三个字符打印的方式有两种&#xff1a; 控制台屏幕的长宽特性&a…

C++笔试强训day38

目录 1.天使果冻 2.dd爱旋转 3.小红取数 1.天使果冻 链接https://ac.nowcoder.com/acm/problem/219641 一开始都可以想到将数组的前x个数拿出来排降序输出第二个数即可。 但是因为询问量和数据量都较大&#xff0c;每次询问一次都要排序一次数组&#xff0c;会超时&#xf…

ai聊天机器人app的分享!有4个热门的软件!

在科技日新月异的今天&#xff0c;AI聊天机器人已经不再是遥不可及的科幻概念&#xff0c;而是实实在在走进了我们的日常生活。无论是工作中的信息查询&#xff0c;还是生活中的闲聊解闷&#xff0c;这些智能助手都能为我们提供便捷、高效的服务。那么&#xff0c;市面上都有哪…

含有嘧啶的光活性阳离子共轭微孔聚合物通过“吸附杀死”抗菌策略促进感染伤口愈合

引用信息&#xff1a; 文 章&#xff1a;Photoactive cationic conjugated microporous polymers containing pyrimidine with an adsorption-killantibacterial strategy for infected wound healing. 期 刊&#xff1a;Chemical Engineering Journal&#xff08;影响因子…

【MySQL】sql语句之库操作

序言 在上篇文章学习当中&#xff0c;我们认识了数据库的相关概念&#xff0c;以及MySQL的框架和基本使用等内容&#xff0c;总之对数据库有了一个大致的认识&#xff0c;那么本篇文章将开始关于sql语句的学习&#xff0c;本文主要是关于库的属性和操作的内容&#xff0c;简单可…

stm32下载驱动ST-LINK/V2驱动下载

http://www.openedv.com/docs/tool/dap/ST-LINKV2.html https://www.stmcu.com.cn/Designresource/detail/fi rmware_software/709492

电商风控指南:“仅退款”成部分商家梦魇,如何有效防控非法牟利

目录 “仅退款”成不法分子牟利新途径 各电商平台的“仅退款”条款模糊 商家如何防范“仅退款”的欺诈 “仅退款”服务已成为各大电商平台的“标配”。然而&#xff0c;以“薅羊毛”的方式谋取不当利益&#xff0c;给商家造成了经济和声誉上的双重损失&#xff0c;引发了广泛关…

CentOS-内网搭建FTP-Server

一、镜像选择 1、 Centos-everting或者DVD 2、7.5 7.6 7.9 均可 二、安装步骤 1、其余步骤和普通安装一致。 2、最重要的一步为“软件选择” 1、勾选FTP、文件以及存储服务器、性能以及开发工具。 三、FTPServer搭建 1、关闭防火墙 systemctl stop firewalld or 通过21和20…

机器视觉——找到物块中心点

首先先介绍一下我用的是HALCON中的HDevelop软件。 大家下载好软件后可以测试一下&#xff1a; 在程序编辑器窗口中输入下面指令&#xff1a; read_image(Image,monkey) 那么如果出现这样的图片&#xff0c;说明是没有问题的 那么本次编程采用的是下面这张图片 我们要达到的…

【论文复现|智能算法改进】基于改进麻雀算法的无线传感器网络覆盖优化研究

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】麻雀搜索算法&#xff08;SSA&#xff09;原理及实现 WSN数学模型 2.改进点 基于Sobol序列和ICMIC混沌映射的种群初始化 ICMIC是一种无线映射折叠次数的映射模型: { z n 1 sin ⁡ ( α π…

客户案例|Zilliz Cloud 助力点石科技转型 AI 智能服务商

福建点石科技网络科技有限公司成立于2010年&#xff0c;是国家高新技术企业&#xff0c;阿里云、蚂蚁金服等大厂海内外生态合作伙伴ISV。在餐饮、零售、酒店、旅游、商圈的行业定制化服务化上有深厚积累&#xff0c;在境内外做了大量标杆性软件项目&#xff0c;如东南亚RWS圣淘…

Python | 试卷刷题and基础笔记

1.下列转义字符中&#xff0c; 属于“回车”含义的是 \n 换行 \r 回车 2.for循环遍历字典 在Python中&#xff0c;你可以使用for循环来遍历字典的键&#xff08;keys&#xff09;、值&#xff08;values&#xff09;或者键-值对&#xff08;items&#xff09;。下面是三种遍历…

Postman接口测试笔记(超详细)

基于工具Poatman的接口自动化基础应用以及接口关联 一、什么是接口&#xff1f; 硬件接口&#xff1a;USB接口&#xff0c;投影仪接口&#xff0c;鼠标键盘接口 软件接口&#xff1a;称为API&#xff0c;主要使用于数据交互 软件接口分类&#xff1a; 内部接口&#xff1a…

树莓派5烧系统和ssh远程实现

1、硬件说明 树莓派5 64G micro SD卡读卡器 2、烧录系统过程记录 之前写过一篇pi4B烧录Ubuntu22.04的博客&#xff0c;这篇就简单记录备份下 2.1 去ubuntu官网在树莓派上安装Ubuntu | Ubuntu下载Ubuntu 桌面 24.04 LTS 我之前已经下好了就有个(1) 2.2 用读卡器把SD卡插到…

实战:一款唯美的个人主页-home2.0-2024.6.4(测试成功)

目录 文章目录 目录实验软件前提条件效果说明1、背景2、配置1、克隆代码库2、配置并构建镜像3、部署测试方案1&#xff1a;从docker容器拷贝生成的静态文件放到网站/目录方案2&#xff1a;启动容器&#xff0c;nginx里配置反向代理&#xff08;推荐&#xff09; 4、访问 3、总结…