leetcode刷题---链表

news2024/11/25 2:52:59

目录

  • 1.删除链表的倒数第N个节点
  • 两两交换链表中的节点
  • 反转链表2

1.删除链表的倒数第N个节点

在这里插入图片描述

根据题目描述,第一个思路是存到数组中对数组进行操作,想到数组我们就可以想到下标和倒数第N个的关系,所以我们可以不额外开空间,可以直接遍历数组求出倒数第N个和链表size之间的关系,然后遍历数组,找到倒数第N个是正数第多少个就可以直接删除那个位置的节点,注意,我们还需要用一个结构体指针变量记录前一个位置。

代码展示:

struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {
    int size=0;//链表大小
    struct ListNode*cur=head;//遍历链表需要的指针
    //求出链表大小
    while(cur)
    {
        cur=cur->next;
        size++;
    }
    //特殊处理:当删除的是最后一个节点的时候,直接删除最后一个位置的节点
    if(n==size)
    {
        struct ListNode*newhead=head->next;
        free(head);
        return newhead;
    }
    int i=size-(n-1);//找出i和size的关系
    struct ListNode*prev=NULL;
    cur=head;
    //遍历数组
    while(i!=1)
    {
        prev=cur;//记录前一个位置
        cur=cur->next;
        i--;
    }
    struct ListNode*next=cur->next;
    free(cur);
    prev->next=next;
    return head;
}

两两交换链表中的节点

在这里插入图片描述

分析题目:题目的要求是让我们交换节点,注意:不是交换节点的值,而是节点之间的交换,首先我们先讨论特殊情况,如果链表为空或者链表只有一个节点则不用交换直接返回头节点,一般情况:我们可以定义一个fast(快指针),然后前后交换了之后,fast走两步,直接就来到了下一个交换的位置,用tmp记录下下个节点的值,这样才能将链表前面的值串起来,==注意:有一种特殊情况,当链表的节点是奇数个的时候最后一个节点不需要交换,所以循环中的终止条件有两个一个是:fast!=NULL还有一个是fast->next,接下来完善代码即可。

代码展示

struct ListNode* swapPairs(struct ListNode* head) {
	//特殊情况处理
    if(head==NULL||head->next==NULL)
    {
        return head;
    }
    //定义fast指针
    struct ListNode*fast=head;
    while(fast!=NULL)
    {
        if(fast->next==NULL)//奇数情况讨论
        {
            break;
        }
        //交换前后节点
        int tmp=fast->val;
        fast->val=fast->next->val;
        fast->next->val=tmp;
        fast=fast->next->next;
    } 
    return head;
}

在这里插入图片描述

题目分析:将小于k的值放在链表左边,将大于或者等于k的值放在链表右边

思路:这里我们需要的6个变量,一个是小于k的链表的头EH,还有尾ET,一个是大于或等于k的头MH和尾MT,还有一个用于遍历链表的变量cur,还有一个变量就是记录cur的下一个位置的变量next,将除了cur以外的变量置为空,然后当遍历数组的时候访问每个节点的val,如果值小于k则用EH和ET连接,如果大于或者等于k的链表,则用MH和MT连接起来,最后将两个链表重新连接起来,最后返回头节点EH。
下图展示思路过程:在这里插入图片描述
代码展示

struct ListNode* partition(struct ListNode* head, int x) {
    if(head==NULL||head->next==NULL)
    {
        return head;
    }
    //小于K的头和尾
    struct ListNode*EH=NULL;
    struct ListNode*ET=NULL;
    //大于或等于K的头和尾
    struct ListNode*MH=NULL;
    struct ListNode*MT=NULL;
    //遍历链表的变量和记录下一个节点的变量
    struct ListNode*cur=head;
    struct ListNode*next=NULL;
    while(cur)
    {
        next=cur->next;
        //判断之后连接
        if(cur->val<x)
        {
            if(EH==NULL&&ET==NULL)
            {
                EH=ET=cur;
                ET->next=NULL;
            }
            else
            {
                ET->next=cur;
                ET=cur;
                ET->next=NULL;
            }
        }
        else{
            if(MH==NULL&&MT==NULL)
            {
                MH=MT=cur;
                MT->next=NULL;
            }
            else{
                MT->next=cur;
                MT=cur;
                MT->next=NULL;
            }
        }
        cur=next;
    }
    //讨论当没有小于K的值的节点时返回大于或者等于K的链表的头
    if(EH==NULL)
    {
        return MH;
    }
    //返回链表头节点
    ET->next=MH;
    return EH;
}

反转链表2

在这里插入图片描述

思路:将链表left前面的节点封装成一个链表,将left和right中间的链表进行翻转,也就是头插,将right后面的节点封装成一个链表,然后将三个链表连接起来返回头结点,方法和上面的隔离链表类似

代码展示

struct ListNode* reverseBetween(struct ListNode* head, int left, int right) {
    if(head->next==NULL||head==NULL)
    {
        return head;
    }
    struct ListNode*midH=NULL;
    struct ListNode*midT=NULL;
    struct ListNode*leftH=NULL;
    struct ListNode*leftT=NULL;
    struct ListNode*rightH=NULL;
    struct ListNode*rightT=NULL;
    struct ListNode*cur=head;
    struct ListNode*next=NULL;
    int n=1;
    while(cur)
    {
        next=cur->next;
        if(n<left)
        {
            if(leftH==NULL&&leftT==NULL)
            {
                leftH=leftT=cur;
                leftT->next=NULL;
            }
            else
            {
                leftT->next=cur;
                leftT=cur;
                leftT->next=NULL;
            }
        }
        else if(n>=left&&n<=right)
        {
            if(midT==NULL&&midH==NULL)
            {
                midH=midT=cur;
                midT->next=NULL;
            }
            else
            {
                cur->next=midH;
                midH=cur;
            }
        }
        else{
            if(rightH==NULL&&rightT==NULL)
            {
                rightH=rightT=cur;
                rightT->next=NULL;
            }
            else{
                rightT->next=cur;
                rightT=cur;
                rightT->next=NULL;
            }
        }
        n++;
        cur=next;
    }
    if(leftH==NULL)
    {
        midT->next=rightH;
        return midH;
    }
    leftT->next=midH;
    midT->next=rightH;
    return leftH;
}

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

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

相关文章

阿里云2核4G5M云服务器ECS u1实例性能测评

阿里云服务器ECS u1实例&#xff0c;2核4G&#xff0c;5M固定带宽&#xff0c;80G ESSD Entry盘优惠价格199元一年&#xff0c;性能很不错&#xff0c;CPU采用Intel Xeon Platinum可扩展处理器&#xff0c;购买限制条件为企业客户专享&#xff0c;实名认证信息是企业用户即可&a…

Python问题列表

文章目录 1、使用pip安装的模块都存放到哪里了&#xff1f;2、安装fitz包报错&#xff0c;如何解决&#xff1f;3、python代码运行时&#xff0c;控制台输出乱码如何解决。4、vscode中第三方库不自动补齐 1、使用pip安装的模块都存放到哪里了&#xff1f; 答&#xff1a; pip是…

数据库安全(redis、couchdb、h2database)CVE复现

redis服务默认端口&#xff1a;6379&#xff1b;我们可以通过端口扫描来判断是否存在该服务。 Redis 是一套开源的使用ANSI C 编写、支持网络、可基于内存亦可持久化的日志型、键值存储数据库&#xff0c;并提供多种语言的API。 Redis 如果在没有开启认证的情况下&#xff0c;…

基于STM32的武警哨位联动报警系统设计,支持以太网和WIFI通信

1.功能 本文提出的武警报警信息系统终端&#xff0c;可实现报警和联动响应&#xff0c;支持以太网和WIFI两种通信模式&#xff0c;可实现移动哨位报警和固定哨位报警&#xff0c;语音和显示报警信息用户可自行定制。 本终端主要由STM32F103处理器模块和C8051F340处理器模块构…

Linux中断管理:(一)中断号的映射

文章说明&#xff1a; Linux内核版本&#xff1a;5.0 架构&#xff1a;ARM64 参考资料及图片来源&#xff1a;《奔跑吧Linux内核》 Linux 5.0内核源码注释仓库地址&#xff1a; zhangzihengya/LinuxSourceCode_v5.0_study (github.com) 1. 中断控制器 Linux 内核支持众多…

K8S之Configmap的介绍和使用

Configmap Configmap概述Configmap的简介Configmap能解决的问题Configmap应用场景局限性 Configmap创建方法通过命令行直接创建通过文件创建指定目录创建编写Configmap资源清单Yaml文件 Configmap的使用案例通过环境变量引入&#xff1a;使用configMapKeyRef通过环境变量引入&a…

QSpice-(2) 添加外部库和波形操作

Hi,uu们,是不是发现QSpice的库元器件比较少,和其他仿真工具相比少的不是一星半点,所以我们可以用外部下载的库文件去补齐这个缺陷,不知道去哪里下载库?可以看看eeworld的这个网址,里面我放了一些库下载的路径,以及LTspice仿真教程. EEworld LtSpice的库文件下载地址: http:/…

记录阿里云服务器VNC登录一直显示Login Incorrect的问题

想要尝试通过VNC实例登录&#xff0c;结果一直提示Login Incorrect 怀疑自己忘记密码后&#xff0c;重置了几次密码还是登录不上去 解决&#xff1a; 发现阿里云把我小键盘的 ""识别为了 “” 号 但是主键盘区域的 键就没有错位 等就是等 加就是加 而小键盘区…

ROS中IMU惯性测量单元

一、IMU惯性测量单元消息包 IMU 是安装在机器人内部的一种传感器模块&#xff0c;用于测量机器人的空间姿态。 IMU的消息包定义在sensor_msgs包中的Imu中。头部是header&#xff0c;记录了消息发送的时间戳和坐标系ID。第二个是角速度。第三个是矢量加速度。三个数据成员都各…

深度学习网络缝合模块学习

主干网络缝合模块------>缝模块对其通道数 1缝合模块只看通道数 2把模块复制到模型中 3在forward中查看通道数是多少 4在init中进行实例化&#xff0c;注意通道数是上一步forward的通道数 5在forward中加载init中的实例化 6模型实例化测试模块是否加入 模块和模块之前…

【OS探秘】【虚拟化】【软件开发】VirtualBox 虚拟化软件卸载和重装

往期OS系列博文&#xff1a; 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装mac OS虚拟机 【OS探秘】【虚拟化】【软件开发】在Windows 11上安装Kali Linux虚拟机 一、事出有因 近日&#xff0c;笔者的Oracle VM VirtualBox突然抽风了&#xff0c;虚拟机无法启动&…

【Spring Security】 快速入门

文章目录 一、 身份认证Demo1、创建工程2、代码编写2.1、Controller2.2、Html2.3、application.properties配置 3、启动项目并访问 二、Spring Security 默认做了什么二、底层原理1.概述2.FiltersDelegatingFilterProxyFilterChainProxySecurityFilterChainSecurity Filters 三…

CAJViewer7.3 下载地址及安装教程

CAJViewer是中国学术期刊&#xff08;CAJ&#xff09;全文数据库的专用阅读软件。CAJViewer是中国知识资源总库&#xff08;CNKI&#xff09;开发的一款软件&#xff0c;旨在方便用户在线阅读和下载CAJ数据库中的学术论文、期刊和会议论文等文献资源。 CAJViewer具有直观的界面…

蓝桥杯刷题第五天(昨天刷了忘记更了)

思路&#xff1a; 用dp来记录最短消耗时间 dp[坐标][zhuangtai] 状态0表示在底部&#xff0c;状态1表示在传送门处&#xff1b; 先初始化dp[1][0] 和dp[1][1]然后循环遍历到dp[n][0] 和dp[n][1]&#xff0c;用动态规划方程去赋值&#xff1b; ps&#xff1a;易错点在于要开…

正弦实时数据库(SinRTDB)的使用(8)-过滤查询

前文已经将正弦实时数据库的使用进行了介绍&#xff0c;需要了解的可以先看下面的博客&#xff1a; 正弦实时数据库(SinRTDB)的安装 正弦实时数据库(SinRTDB)的使用(1)-使用数据发生器写入数据 正弦实时数据库(SinRTDB)的使用(2)-接入OPC DA的数据 正弦实时数据库(SinRTDB)…

目标伪类选择器

E:target选择匹配E的所哟元素&#xff0c;且匹配元素被相关url指向 鼠标点击右边京东秒杀跳转到京东秒杀div&#xff0c;并变成黄色 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport&…

基于 FFmpeg 和 SDL 的音视频同步播放器

基于 FFmpeg 和 SDL 的音视频同步播放器 基于 FFmpeg 和 SDL 的音视频同步播放器前置知识音视频同步简介复习DTS、PTS和时间基 程序框架主线程解复用线程音频解码播放线程视频解码播放线程 音视频同步逻辑源程序结果工程文件下载参考链接 基于 FFmpeg 和 SDL 的音视频同步播放器…

js垃圾回收新生代和老生代以及堆栈内存详细

js 堆栈内存、新生代和老生代、垃圾回收详聊 要想了解JS内存管理就必须明白存这些js数据的内存又分为&#xff1a;栈内存和堆内存 一、 栈|堆内存(Stack|Heap) 栈(Stack)内存 原始值&#xff1a;Number、String、Boolean、Null、Undefined、Symbol和BigInt 栈内存主要存储原始…

Mac使用“Workstation”安装双系统

## 选择虚拟机 Mac推荐使用“VMware” 优点 1.个人版是免费的 2.界面清晰&#xff0c;运行流程 3.使用人群广&#xff0c;遇到问题容易解决 版本比较 VMware Workstation Pro 和 VMware Workstation Player 个人使用推荐 VMware Workstation Player &#xff0c;因为个人的…

安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 从0开始 工具操作解析【三】

同类博文; 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析 安卓玩机工具推荐----MTK芯片读写分区 备份分区 恢复分区 制作线刷包 工具操作解析【二】-CSDN博客 回顾以往 在以前的博文简单介绍了这款工具的rom制作全程。今天针对这款工具的…