C语言简单的数据结构:单链表的有关算法题(2)

news2024/10/6 12:27:14

题目:

  • 4. 单链表相关经典算法OJ题3:合并两个有序链表
  • 5. 循环链表经典应⽤-环形链表的约瑟夫问题
  • 6. 单链表相关经典算法OJ题5:分割链表

接着我们介绍后面的三道题,虽然代码变多了但我们的思路更加通顺了

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

题目链接:https://leetcode.cn/problems/merge-two-sorted-lists/
在这里插入图片描述
创建新链表,遍历原链表,将节点值小的进行尾插到新链表中
在这里插入图片描述
这里要多次进行对NULL的判断,开始传入列表,中间newHead的判断,循环出来一个为NULL的判断
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
重复原因:新链表存在空链表和非空两种情况
优化的方法:
1.将重复的部分封装成一个函数
2.动态申请一个空间但这个空间部存储任何的信息
那么我们着重讲一下第二个方法:
在这里插入图片描述

他的解决方法就是让新链表不为NULL
在创建时动态申请一块空间,但不存储任何数据,让NULL节点变为非NULL的节点,这是就不用判断链表是不是为非NULL
在这里插入图片描述
在这里插入图片描述

但这时返回就不能将头节点直接返回,而是要将头节点的下一个位置的地址返回
在这里插入图片描述
当然释放的空间还是要释放一下,来使代码更加完善
在这里插入图片描述

/**
 * 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) {
    ListNode* l1 = list1;
    ListNode* l2 = list2;
    //判空
    if(list1 == NULL)
    {
        return list2;
    }
    if(list2 == NULL)
    {
        return list1;
    }

    ListNode* newHead,*newTail;
    //newHead = newTail = NULL;
    newHead = newTail = (ListNode*)malloc(sizeof(ListNode));
    
    while(l1 && l2)
    {
        if(l1->val < l2->val)
        {
            newTail->next = l1;
            newTail = newTail->next;
            l1 = l1->next;
        }
        else
        {
            newTail->next = l2;
            newTail = newTail->next;
            l2 = l2->next;
        }
    }
    //跳出循环有两种情况
    if(l2 != NULL)
    {
        newTail->next = l2;
    }
    if(l1 != NULL)
    {
        newTail->next = l1;
    }
    ListNode* ret = newHead->next;
    free(newHead);
    newHead = NULL;
    return ret;
}

其实这样的链表叫带头链表,这个“头”一般称作哨兵位

5. 循环链表经典应⽤-环形链表的约瑟夫问题

题目链接:https://www.nowcoder.com/practice/41c399fdb6004b31a6cbb047c641ed8a
在这里插入图片描述
思路一:用数组的方法,先进行遍历然后将离开的人置为0,然后不断循环遍历最中不为0的就是我们要的数据
思路二:循环链表的方法
我们先介绍一下循环链表:
在这里插入图片描述
这里涉及到循环链表,其实也就是单链表但是尾部相连了
那么在创建和删除时要多注意就行了
在这里插入图片描述
循环数数,将数到2的,将其删除
在这里插入图片描述

这里就要使用前后指针
在这里插入图片描述
代码的难点就是创建循环链表

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 * 
 * @param n int整型 
 * @param m int整型 
 * @return int整型
 */
 #include <stdio.h>
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++)
    {
        ptail->next = buyNode(i);
        ptail = ptail->next;
    }
    ptail->next = phead;
    return ptail;
 }
int ysf(int n, int m ) {
    // write code here
    ListNode* prev = createCircle(n);
    ListNode* pcur = prev->next;
    int count = 1;
    while (prev->next != pcur)//链表只有一个节点 
    {
        if(count == m)
        {
            //销毁,先连接,在销毁
            prev->next = pcur->next;
            free(pcur);
            pcur = prev->next;
            count = 1;
        }
        else 
        {
            prev = pcur;
            pcur = pcur->next;
            count++;
        }
    }
    return pcur->val;
}

6. 单链表相关经典算法OJ题5:分割链表

题目链接:https://leetcode.cn/problems/partition-list-lcci/description/
在这里插入图片描述
在这里插入图片描述
思路一:将原列表复制一份,然后对大于等于x的进行操作,先尾插后销毁
在这里插入图片描述
思路二:或者创建一个新链表进行存储,对大于的数进行尾插,小于的进行头插
在这里插入图片描述
思路三:创建两个新链表:小链表和大链表
在这里插入图片描述
分成两个链表然后将两个链表连接起来
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里就是greaterHead后的指针不为NULL,而是一个随机地址
在这里插入图片描述
将两个代码换过来,就可以解决这个问题了
在这里插入图片描述

/**
 * 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)
        {
            //小链表
            lessTail->next = pcur;
            lessTail = lessTail->next;
        }
        else
        {
            greaterTail->next =pcur;
            greaterTail = greaterTail->next;
        }
        pcur = pcur->next;
    }
    //首尾相连
    greaterTail->next = NULL;
    lessTail->next = greaterHead->next;
    

    ListNode* ret = lessHead->next;
    free(lessHead);
    free(greaterHead);
    lessHead = greaterHead = NULL;
    return ret;
}

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

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

相关文章

DC-5渗透测试复现

DC-5渗透测试复现 目的&#xff1a; 获取最高权限以及5个flag 过程&#xff1a; 信息打点-文件包含漏洞-弹shell- scren-4.0.5提权 环境&#xff1a; 攻击机&#xff1a;kali(192.168.85.136) 靶机&#xff1a;DC_3(192.168.85.134) 复现&#xff1a; 一.信息收集 nma…

MES生产管理系统:私有云、公有云与本地化部署的比较分析

随着信息技术的迅猛发展&#xff0c;云计算作为一种新兴的技术服务模式&#xff0c;已经深入渗透到企业的日常运营中。在众多部署方式中&#xff0c;私有云、公有云和本地化部署是三种最为常见的选择。它们各自具有独特的特点和适用场景&#xff0c;并在不同程度上影响着企业的…

EEG-GCNN 论文问题整理

auc是什么&#xff1f; AUC是指接收者操作特征曲线&#xff08;ROC曲线&#xff09;下的面积&#xff0c;用于评估分类模型的性能。AUC的取值范围在0到1之间&#xff0c;越接近1表示模型的性能越好&#xff0c;越接近0.5表示模型的性能越差。AUC的计算方法是通过计算ROC曲线下…

HiveQL练习(hive3.x)

零、准备工作 1. Hive环境安装 参见搭建Hive 3.x环境&#xff08;CentOS 9 Hadoop3.x&#xff09; 2. 准备数据 在虚拟机HOME目录创建如下文件内容&#xff1a; cd /root vi emp.csv内容如下&#xff1a; 7369,SMITH,CLERK,7902,1980/12/17,800,,20 7499,ALLEN,SALESMAN…

基于STM32的快递小车无人驾驶系统

目录 摘 要 一、绪论 1.1 背景和意义 1.1.1 背景 1.1.1 意义 1.2 国内外研究现状 二、小车设计方案 2.1 方案一 2.2 方案二 2.3 方案三 2.4 方案选择与论证 三、硬件设计方案 3.1 单片机最小系统 3.2 光耦隔离电路 3.3 电源模块电路 3.4 直流电机驱动电路 3.…

Lua脚本使用手册(Redis篇)

Lua脚本 **简介&#xff1a;**Lua是一种功能强大的&#xff0c;高效&#xff0c;轻量级&#xff0c;可嵌入的脚本语言。它是动态类型语言&#xff0c;通过使用基于寄存器的虚拟机解释字节码运行&#xff0c;并具有增量垃圾收集的自动内存管理&#xff0c;是配置&#xff0c;脚…

数据资产与数据要素的重要性及数据资产入表的实践指南

## 引言在当今快速发展的数字化时代&#xff0c;数据资产已经成为企业最宝贵的资源之一。数据资产不仅对企业的运营决策有着至关重要的影响&#xff0c;而且在企业的财务健康和市场竞争力方面扮演着核心角色。数据要素&#xff0c;作为构成数据资产的基本单元&#xff0c;其管理…

【攻防世界】bug

垂直越权IP绕过文件上传 文件上传绕过&#xff1a; 1. mime检测 2. 大小写绕过 3. 等价替换&#xff08;php5&#xff0c;php3&#xff09; 4. 利用JavaScript执行php代码&#xff08;正常的php代码会被检测到&#xff0c;所以就用JavaScript来执行&#xff09; <script lan…

终端工具命令行颜色配置(解决终端工具连上服务器之后,无颜色问题)

本期主题&#xff1a; 讲解使用mobaxterm等终端工具连上服务器&#xff0c;但是命令行没有颜色的问题 目录 1. 问题描述2. 原因解释3.测试 1. 问题描述 使用终端工具&#xff08;Mobaxterm等&#xff09;连上服务器之后&#xff0c;发现终端工具没有颜色&#xff0c;如下图&am…

数模 线性规划模型理论与实践

线性规划模型理论与实践 1.1 线性规划问题 在人们的生产实践中&#xff0c;经常会遇到如何利用现有资源来安排生产&#xff0c;以取得最大经济效益的问题。此类问题构成了运筹学的一个重要分支一数学规划&#xff0c;而线性规划(Linear Programming 简记LP)则是数学规划的一个…

深度学习学习日记4.14 数据增强 Unet网络部分

数据增强 transforms.Compose([&#xff1a;这表示创建一个转换组合&#xff0c;将多个数据转换操作串联在一起 transforms.RandomHorizontalFlip()&#xff1a;这个操作是随机水平翻转图像&#xff0c;以增加数据的多样性。它以一定的概率随机地水平翻转输入的图像。 transfo…

系统架构最佳实践 -- 金融企业的资损防控

一、资损产生的原因 由于支付行业的特殊性与复杂性&#xff08;主要处理资金相关业务&#xff09;&#xff0c;支付公司处于资损的风口浪尖&#xff0c;最容易发生资损&#xff0c;可以说资损风险无处不在。 常规来说&#xff0c;资损原因主要可以分为以下三类&#xff1a; 1…

Linux设备驱动开发-字符设备

阅读引言&#xff1a; 从linux文件的种类、字符设备的创建、设备号、申请设备号、cdev对象和字符设备的对应关系、应用层调用到我们编写的设备驱动方法合集的流程。 目录 一、Linux文件的种类 二、Linux对设备的分类 三、驱动程序如何向应用层提供接口 四、Linux中设备的划…

微服务之LoadBalancer负载均衡服务调用

一、概述 1.1什么是负载均衡 LB&#xff0c;既负载均衡&#xff08;Load Balancer&#xff09;,是高并发、高可用系统必不可少的关键组件&#xff0c;其目标是尽力将网络流量平均分发到多个服务器上&#xff0c;以提高系统整体的响应速度和可用性。 负载均衡的主要作用 高并发…

华为机考入门python3--(15)牛客15-求int型正整数在内存中存储时1的个数

分类&#xff1a;二进制 知识点&#xff1a; int转二进制 binary bin(n)[2:] 题目来自【牛客】 def count_ones_in_binary(n): # 将输入的整数转换为二进制字符串 # bin(n)为0b11011binary bin(n)[2:]# 初始化计数器为0 count 0 # 遍历二进制字符串的每一位 fo…

2024年大唐杯备考

努力更新中…… 第一章 网络架构和组网部署 1.1 5G的网络整体架构 5G网络中的中传、回传、前传&#xff08;这里属于承载网的概念&#xff09; CU和DU之间是中传 BBU和5GC之间是回传 BBU和AAU之间是前传&#xff08;这个好记&#xff09; 这里竟然还藏了MEC&#xff08;…

YOLTV8 — 大尺度图像目标检测框架(欢迎star)

YOLTV8 — 大尺度图像目标检测框架【ABCnutter/YOLTV8: &#x1f680;】 针对大尺度图像&#xff08;如遥感影像、大尺度工业检测图像等&#xff09;&#xff0c;由于设备的限制&#xff0c;无法利用图像直接进行模型训练。将图像裁剪至小尺度进行训练&#xff0c;再将训练结果…

使用Python的Pillow库进行图像处理书法参赛作品

介绍&#xff1a; 在计算机视觉和图像处理领域&#xff0c;Python是一种强大而流行的编程语言。它提供了许多优秀的库和工具&#xff0c;使得图像处理任务变得轻松和高效。本文将介绍如何使用Python的wxPython和Pillow库来选择JPEG图像文件&#xff0c;并对选中的图像进行调整和…

STM32常见调试工具介绍

STM32的常见调试工具主要包括ST-LINK、USB转TTL、USB转485以及USB转CAN。这些工具在嵌入式系统开发、调试以及通信中发挥着重要的作用。 1.ST-LINK&#xff1a; ST-LINK是STMicroelectronics公司专为其STM32系列微控制器开发的调试和编程工具。既能仿真也能将编译好的程序下载…

python应用-os库操作目录

python自带的os模块提供了许多与操作系统交互的函数&#xff0c;适配多种操作系统&#xff0c;比如windows&#xff0c;mac&#xff0c;linux等&#xff0c;比如常用路径操作、进程管理、环境参数等都可通过os模块实现。 以下是自带的os.py中的前面一部分代码。 第一个红框中主…