数据结构算法题 2(力扣)——链表

1. 分割链表(OJ链接)

题目描述:给你一个链表的头节点 head 和一个特定值 x ,请你对链表进行分隔,使得所有小于 x 的节点都出现在大于或等于 x 的节点之前

本题做法是:遍历链表将链表分为两部分,一部分的结点值小于特定值,另一部分的结点值大于或等于特定值,最后将两个链表链接起来。为了方便,下面将两部分链表称为大小链表。(值大于等于或小于特定值的链表)

为了便于将结点链接到大小链表中,采用带头结点的方式解决,可以避免大小链表为空或者不为空的讨论。

当遍历完链表后,可能出现链表成环的情况,因此需要将大链表的尾指针置空。

题解代码如下

typedef struct ListNode ListNode;
struct ListNode* partition(struct ListNode* head, int x)
{
    if(head==NULL)
    {
        return NULL;
    }
    //创建两个带头链表
    ListNode* lesshead,*lesstail,*morehead,*moretail,*cur;
    lesshead=lesstail=(ListNode*)malloc(sizeof(ListNode));
    morehead=moretail=(ListNode*)malloc(sizeof(ListNode));
    cur=head;
    //遍历原链表
    while(cur)
    {
        if(cur->val<x)
        {
            lesstail->next=cur;
            lesstail=lesstail->next;
        }
        else
        {
            moretail->next=cur;
            moretail=moretail->next;
        }
        cur=cur->next;
    }
    //防止成环
    moretail->next=NULL;
    //首尾相连
    lesstail->next=morehead->next;
    ListNode* ret=lesshead->next;
    free(lesshead);
    free(morehead);
    return ret;
}

lesshead,lesstail,morehead,moretail分别是小链表和大链表的头尾指针。最初都指向头结点。

2. 旋转链表(OJ链接)

题目描述:给你一个链表的头节点head ,旋转链表,将链表每个节点向右移动 k 个位置。

示例:
在这里插入图片描述
结果可以看作将后2个结点原封不动的挪到前面。因此需要找到倒数第k个结点,方法就是快慢指针法。

本题需要注意k的值,k可能很大,比如远大于结点的个数,当k等于结点的个数时,所有结点向右移动k个位置相当于不用移动,因此需要对k进行求余操作。

此题做法为:快慢指针法。首先先计算链表结点的数目,对k进行求余。fast指针先走k步,之后和慢指针以相同速度走,快指针为NULL时,慢指针指向的结点就是倒数第k个结点。为了避免成环,需要将倒数第k+1个结点的指针域置空,最后链接两部分链表即可。

一些需要注意的小的点就不多赘述了,比如链表为空或者只有一个结点,那么直接返回NULL或head即可。

题解代码如下:

struct ListNode* rotateRight(struct ListNode* head, int k) 
{
    //结点数为0
    if(head==NULL)
    return NULL;
    //结点数为1
    if(head->next==NULL)
    return head;

    struct ListNode* cur=head,*fast=head,*prev=head,*tail=head;
    int num=0;
    //计算链表结点个数
    while(cur)
    {
        num++;
        cur=cur->next;
    }
    k%=num;

    if(k==0)
    return head;
    //fast先走k步
    cur=head;
    while(k--)
    {
        fast=fast->next;
    }
    while(fast)
    {
        prev=cur;
        cur=cur->next;
        tail=fast;
        fast=fast->next;
    }
    //解环并链接首尾
    prev->next=NULL;
    tail->next=head;
    return cur;
}

指针含义:cur——指向新链表的头,prev——cur的前一个结点,tail——指向最后一个结点
对上述示例进行画图帮助理解代码,过程如下图
在这里插入图片描述
本题到此就结束咯

3. 环形链表(OJ链接)

题目描述:给你一个链表的头节点 head ,判断链表中是否有环。

此题解法:快慢指针法,快指针一次走两步,慢指针一次走一步。两个指针指向同一个结点时,说明链表有环,快指针为NULL时说明链表没有环。

代码如下

bool hasCycle(struct ListNode *head) {
    struct ListNode* fast=head,*slow=head;
    while(fast!=NULL&&fast->next!=NULL)
    {
        slow=slow->next;
        fast=fast->next->next;
        if(slow==fast)
        {
            return true;
        }
    }
    return false;
}

本题代码比较简单,但是这个思路是否正确需要验证,本质是一道数学题,验证过程如下图。

在这里插入图片描述

4. 环形链表2(OJ链接)

题目描述:给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。

这个题可以看成上一题的后续,有环则找入环点。

这里先证明一个式子再写代码:有两个指针,一个指针从链表的头走,一个指针从相遇点走,并且同速走,那么当两个指针相遇时,相遇的那个结点就是入环点。

证明过程如下图
在这里插入图片描述
那么有了上述的结论再加上上一题的思路,本题就比较简单了。

struct ListNode* detectCycle(struct ListNode* head) 
{
    struct ListNode *fast = head, *slow = head;
    while (fast != NULL && fast->next != NULL) 
    {
        slow = slow->next;
        fast = fast->next->next;
        if (fast == slow) 
        {
            struct ListNode* meet = slow;
            while (meet != head) 
            {
                meet = meet->next;
                head = head->next;
            }
            return meet;
        }
    }
    return NULL;
}

链表部分的题目就到此为止了,后续就对栈队列等数据结构进行练习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Discord注册教程:Discord刚注册就被封怎么办?附申诉教程!

Discord如今在海外社交媒体平台中迅速崛起&#xff0c;许多社交媒体营销人员也纷纷利用其社群特性进行推广&#xff0c;Discord注册也就成为社媒营销人员必经之路。然而&#xff0c;很多人注册Discord账号时常常会想&#xff1a;“在国内使用Discord会封号吗&#xff1f;”事实…

STC12单片机设置50Hz的PWM波驱动舵机

本文将使用STC12C5A60S2配置PWM波&#xff0c;驱动SG90舵机。 采用的开发板包括了CH340芯片&#xff0c;因此下载程序只需要使用MicroUSB转USB连接线使用STC-ISP.exe软件下载程序即可。 1 芯片资源 芯片型号STC12C5A60S2&#xff0c;增强型8051 CPU&#xff0c;1T&#xff0c…

计算机组成原理 — CPU 的结构和功能

CPU 的结构和功能 CPU 的结构和功能CPU 概述控制器概述CPU 框架图CPU 寄存器控制单元 CU 指令周期概述指令周期的数据流 指令流水概述指令流水的原理影响流水线性能的因素流水线的性能流水线的多发技术流水线结构 中断系统概述中断请求标记和中断判优逻辑中断请求标记 INTR中断…

Mysql底层原理五:如何设计、用好索引

1.索引的代价 空间上的代价 时间上的代价 每次对表中的数据进⾏增、删、改操作时&#xff0c;都需要去修改各个B树索引。⽽且我们讲过&#xff0c;B树每层节点都是按照索引列的值从⼩到⼤的顺序排序⽽组成了双 向链表。不论是叶⼦节点中的记录&#xff0c;还是内节点中的记录&a…

设计模式实践

一、工厂模式 这里只讲简单工厂模式&#xff0c;详细的可以参考Java工厂模式&#xff08;随笔&#xff09;-CSDN博客。工厂类会根据不同的参数或条件来决定创建哪种对象&#xff0c;这样客户端只需要知道自己需要什么对象&#xff0c;而不需要关心对象的创建过程&#xff01; …

Golang 开发实战day06 - Boolean Conditional

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 教程06 - Boolean &a…

分布式锁的原子性问题

4.6 分布式锁的原子性问题 更为极端的误删逻辑说明&#xff1a; 线程1现在持有锁之后&#xff0c;在执行业务逻辑过程中&#xff0c;他正准备删除锁&#xff0c;而且已经走到了条件判断的过程中&#xff0c;比如他已经拿到了当前这把锁确实是属于他自己的&#xff0c;正准备删…

如何在CentOS安装Nexus容器无公网IP远程管理本地仓库

文章目录 1. Docker安装Nexus2. 本地访问Nexus3. Linux安装Cpolar4. 配置Nexus界面公网地址5. 远程访问 Nexus界面6. 固定Nexus公网地址7. 固定地址访问Nexus Nexus是一个仓库管理工具&#xff0c;用于管理和组织软件构建过程中的依赖项和构件。它与Maven密切相关&#xff0c;可…

数据通讯平台解决方案(Word原件获取)

1.数据通讯平台方案 1.1.系统概述 1.2.需求分析 1.3.重难点分析 1.4.重难点解决措施 2.系统架构设计 2.1.系统架构图 系统机构图 2.2.业务架构设计 (1) MQ消息服务 (2) TCP通讯服务 (3) CoAP通讯服务 (4) MQTT通讯服务 (5) 资源管理服务 2.3.主流技术架构分析 纵向设计方案 2.4…

QGraphics框架场景中图元的移除与析构

1.场景里面使用removeItem函数&#xff0c;这个函数官方给出如下解释 注意这个词remove只是移除&#xff0c;并不是delete掉&#xff0c;所以只是场景中&#xff08;显示出来的图元&#xff09;没有了&#xff0c;空间还是存在。 举个代码例子&#xff1a; void MyGraphicsV…

USACO 2024 Open Bronze铜组题解

迟到了一个月的题解...... Logical Moos: 啊这题放在铜组T1雀食有点BT...... 首先&#xff0c;我们关注l前第一和r最后那两组。如果这俩有一个是true&#xff0c;那答案肯定也是true。 否则&#xff0c;在l和r外边的都是false。那我们就只用仔细看l和r中间的玩意儿。对于l和…

三月以来的黄金暴涨 ,华尔街都看不懂

本轮黄金大幅上涨无法按照美联储政策逻辑解释&#xff0c;央行的购金需求也无法合理化金价的历史新高&#xff0c;而金价的大涨也与黄金ETF流出相背&#xff0c;推动反弹的“神秘力量”令分析师困惑不已。 黄金上涨的情况往往会出现在美联储开启降息周期后&#xff0c;如果市场…

Linux 之 定时任务调度器-crond(crontab)服务

Linux系列文章&#xff1a; Windows本地如何添加域名映射&#xff1f;&#xff08;修改hosts文件&#xff09;_本机域名映射-CSDN博客 Linux安装mysq 8.0服务端和客户端(亲测保成功&#xff09;_linux安装mysql客户端-CSDN博客 linux-man命令的使用及练习_man命令执行后无法…

微服务架构下,如何通过弱依赖原则保障系统高可用?

前言 当我初次接触高可用这个概念的时候&#xff0c;对高可用的【少依赖原则】和【弱依赖原则】的边界感模糊&#xff0c;甚至有些“傻傻分不清楚”。这两个原则都关注降低模块之间的依赖关系&#xff0c;但它们之间的确存在某些差异。 那么&#xff0c;「少依赖原则」和「弱…

Windows深度学习环境----Cuda version 10.2 pytorch3d version 0.3.0

Requirements Python version 3.8.5Pytorch version: pytorch1.6.0 torchvision0.8.2 torchaudio0.7.0 cudatoolkit10.2.89pytorch3d version 0.3.0Cuda version 10.2 感觉readme文件里的不适配&#xff0c;跟pytorch官网不同 以前的 PyTorch 版本 |PyTorch的 # CUDA 10.2 c…

面板数据回归模型(二)房价的影响因素分析

1.数据来源 本文选择我国出一线城市房价均值、新一线城市房价均值、二线城市房价均值、货币供应量和利率。选取2002-2018年的数据,共17组数据,由于数据的自然对数变换不改变原有的协整关系,并能使其趋势线性化,消除时间序列中存在的异方差现象,所以对所有数据取其自然对数…

程序员简历程序员简历.pdf

你们在制作简历时&#xff0c;是不是基本只关注两件事&#xff1a;简历模板&#xff0c;还有基本信息的填写。 当你再次坐下来更新你的简历时&#xff0c;可能会发现自己不自觉地选择了那个“看起来最好看的模板”&#xff0c;填写基本信息&#xff0c;却没有深入思考如何使简历…

聊一下Redis实现分布式锁的8大坑

前两篇文章都在讲 Redis 的 5 大常用数据类型&#xff0c;以及典型的 10 大应用场景。 那么今天就来看看 Redis 实现分布式锁。 聊一聊Redis实现分布式锁的8大坑 Redis中5大常见数据类型用法 工作中Redis用的最多的10种场景 在分布式系统中&#xff0c;保证资源的互斥访问是…

新火种AI|拳打百度,脚踢阿里...令国产大模型危机感爆棚的kimi强势上线!

作者&#xff1a;小岩 编辑&#xff1a;冰冰 Sora大火后&#xff0c;生成式AI的高光时候终于轮到了国产大模型。2024年3月&#xff0c;Kimi智能助手在市场上掀起了一股狂热的热潮。 Kimi是由时下大火的AI初创公司——北京月之暗面科技有限公司所推出的一款智能助手&#xff…

自动化测试框架 - Unittest 学习笔记速查

文章目录 UnitTest 简介UnitTest 核心UnitTest 原理UnitTest 断言函数TestCase&#xff08;用例&#xff09;基本用法执行结果 TestFixture&#xff08;夹具&#xff09;方法级夹具类级夹具模块级夹具 TestSuite&#xff08;套件&#xff09;TestLoader&#xff08;加载器&…