LeetCode刷题系列之----->(指针玩转链表篇)(三)

news2025/1/10 3:18:02

🍉博客主页:阿博历练记
📖文章专栏:数据结构与算法
🔍代码仓库:阿博编程日记
🌹欢迎关注:欢迎友友们点赞收藏+关注哦

在这里插入图片描述

文章目录

    • 🖋1.题目描述
    • 💡 逻辑分析
    • 📃哨兵位的概念
    • ❌错误案例(不带哨兵位)
    • ✔代码纠正
      • 1.不带哨兵位
      • 2.带哨兵位
    • 🖋2.题目描述
    • 📒 回文链表的概念(逻辑实现)
    • ⭐疑问解析
    • 🏆代码展示
    • 🖋3.题目描述
    • 💡 逻辑分析
    • 🏆代码展示

🖋1.题目描述

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。

💡 逻辑分析

在这里插入图片描述

📃哨兵位的概念

哨兵位的头结点不存储有效数据,是一个附加的链表节点,该节点作为第一个节点,它的值域不存储任何东西.只是为了操作的方便而引入的,如果一个链表有哨兵节点的话,那么线性表的第一个元素应该是链表的第二个节点.

❌错误案例(不带哨兵位)

#include <cstddef>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct  ListNode*lesshead=NULL,*lesstail=NULL,*graterhead=NULL,*gratertail=NULL;
        struct  ListNode*cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
               if(lesstail==NULL)
               {
                 lesshead=lesstail=cur;
               }
               else 
               {
                  lesstail->next=cur;
                  lesstail=lesstail->next;
               }
            }
            else
            {
               if(gratertail==NULL)
               {
                graterhead=gratertail=cur;
               }
               else 
               {
                 gratertail->next=cur;
                 gratertail=gratertail->next;
               }
            }
            cur=cur->next;
        }
        lesstail->next=graterhead;
        return    lesshead;
 }
};

在这里插入图片描述

✔代码纠正

1.不带哨兵位

#include <cstddef>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct  ListNode*lesshead=NULL,*lesstail=NULL,*graterhead=NULL,*gratertail=NULL;
        struct  ListNode*cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
               if(lesstail==NULL)
               {
                 lesshead=lesstail=cur;
               }
               else 
               {
                  lesstail->next=cur;
                  lesstail=lesstail->next;
               }
            }
            else
            {
               if(gratertail==NULL)
               {
                graterhead=gratertail=cur;
               }
               else 
               {
                 gratertail->next=cur;
                 gratertail=gratertail->next;
               }
            }
            cur=cur->next;
        }
        if(lesstail==NULL)
        return   graterhead;
        else
        {
        lesstail->next=graterhead;
        if(gratertail)
        gratertail->next=NULL;
        return    lesshead;
        }
 }
};

2.带哨兵位

#include <cstddef>
class Partition {
public:
    ListNode* partition(ListNode* pHead, int x) {
        struct  ListNode*lesshead,*lesstail,*graterhead,*gratertail;
        lesshead=lesstail=(struct  ListNode*)malloc(sizeof(struct ListNode));
        graterhead=gratertail=(struct  ListNode*)malloc(sizeof(struct ListNode));
        struct  ListNode*cur=pHead;
        while(cur)
        {
            if(cur->val<x)
            {
                  lesstail->next=cur;
                  lesstail=lesstail->next;
            }
            else
            {
                 gratertail->next=cur;
                 gratertail=gratertail->next;
            }
            cur=cur->next;
        }
        lesstail->next=graterhead->next;
        gratertail->next=NULL;
        pHead=lesshead->next;
        free(lesshead);
        free(graterhead);
        return  pHead;
    }
};

友友们注意了,当我们用完哨兵位之后,我们要及时把它释放掉,返回链表新的头结点

🖋2.题目描述

在这里插入图片描述

📒 回文链表的概念(逻辑实现)

回文结构特征是正着读和反着读是一样的,因此我们只要找到链表的中间结点,再将链表的后半部分逆置,使用两个指针分别从头和中间结点开始遍历,如果在他们的next为空之前一直相等,说明该链表为回文结构

⭐疑问解析

在这里插入图片描述

🏆代码展示

class PalindromeList {
public:
 struct ListNode* reverseList(struct ListNode* head){
     struct  ListNode*cur=head;
     if(cur==NULL)
     {
         return  NULL;
     }
     struct  ListNode*rhead=NULL;
     struct  ListNode*next=cur->next;
     while(cur)
     {
     cur->next=rhead;
         rhead=cur;
         cur=next;
         if(cur)
         {
         next=cur->next;
         }
     }
     return  rhead;
}
struct ListNode* middleNode(struct ListNode* head){
     struct  ListNode*slow=head;
     struct  ListNode*fast=head;
     while(fast&&fast->next)
     {
         fast=fast->next->next;
         slow=slow->next;
     }
     return  slow;
}
bool chkPalindrome(ListNode* head){
     struct  ListNode*mid=middleNode(head);
     struct  ListNode*rmid=reverseList(mid);
     while(rmid)
     {
     if(rmid->val!=head->val)
        {
        return  false;
        }
        head=head->next;
        rmid=rmid->next;
     }
     return  true;
 }
 };

🖋3.题目描述

在这里插入图片描述

💡 逻辑分析

我们先求出链表A和链表B的长度L1和L2,使用双指针,并将他们对齐,即若A链表节点比B节点多n个,则将A的指针向后移动n个,B链表比A链表多时同理.保证剩余链表长度相同,然后在一起走,两个指针同步向后移动1个节点,要么同时找到第一个交点,要么都为NULL.

🏆代码展示

struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {
    int t1=0;
    int t2=0;
    struct  ListNode*p1=headA;
    struct  ListNode*p2=headB;
    if(p1==NULL||p2==NULL)
    return  NULL;
    while(p1)
    {
        t1++;
        p1=p1->next;
    }
    p1=headA;
    while(p2)
    {
        t2++;
        p2=p2->next;
    }
    p2=headB;
    if(t1>t2)
    {
    int temp=t1-t2;
       while(temp)
       {
           p1=p1->next;
           temp--;
       }
    }
    else
    {
        int  temp=t2-t1;
        while(temp)
        {
            p2=p2->next;
            temp--;
        }
    }
    while(p1&&p1!=p2)
    {
        p1=p1->next;
        p2=p2->next;
    }
    return  p1;
}

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

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

相关文章

Java+Selenium常用方法梳理

五一假期&#xff0c;祝大家节日快乐。本篇继续自动化测试知识梳理。selenium 自己封装好用的方法&#xff0c;如悬停&#xff0c;句柄获取&#xff0c;可直接调用&#xff0c;实现自己的需求。 1、多窗口切换 即获取页面的句柄&#xff0c;来实现页面的切换&#xff0c;以ha…

GC日志分析工具一GCview使用介绍

目录 一、GCViewer介绍 二、GCViewer 使用 2.1 编译 2.2 使用 一、GCViewer介绍 业界较为流行分析GC日志的两个工具——GCViewer、GCEasy。GCEasy部分功能还是要收费的&#xff0c;今天笔者给大家介绍一下GCViewer的使用与功能点。Memory Analyzer Mat JVM 分析 二、GCVi…

Msfconsole使用永恒之蓝入侵Win7并上传执行可执行文件

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、信息收集二、开始入侵1.启动msfconsole2.搜索漏洞3.文件上传其他 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 我昨天我测…

初识springframework

目录 一.框架的概念&#xff1a; 1.什么是框架&#xff1f; 2.框架的作用&#xff1f; 二.springframework-core(bean容器) 1.什么是bean容器&#xff1f; 对bean容器的理解&#xff08;M&#xff09; 对IOC和DI的理解&#xff08;M&#xff09; DI的底层实现原理是依赖…

Linux:网络套接字

理解源IP地址和目的IP地址 在IP数据包头部中, 有两个IP地址, 分别叫做源IP地址, 和目的IP地址. 思考: 我们光有IP地址就可以完成通信了嘛? 想象一下发qq消息的例子, 有了IP地址能够把消息发送到对方的机器上, 但是还需要有一个其他的标识来区分出, 这个数据要给哪个程序进行…

@Autowired和@Resource注解之间的关系区别,Bean的作用域和生命周期,Spring的执行流程

目录 一. Autowired 和 Resource 注解 二. Bean的作用域 1. singleton(单例模式) 2. prototype(原型模式)(多例模式) 3. 请求作用域&#xff1a;request 4. 会话作用域&#xff1a;session 三. Spring 的执行流程 四. Bean 的生命周期 1. 实例化 2. 设置属性 3. Bea…

【数据结构初阶】环形链表

目录 一、判断链表中是否存在环思路分析 二、求环的长度三、求入环点 一、判断链表中是否存在环 题目链接&#xff1a; 判断链表中是否存在环 思路 把它转换为追击问题&#xff08;快慢指针&#xff09; 快指针比慢指针多走一步&#xff0c;当快指针正好进入环时&#xff0c;慢…

脑科学数据挖掘论文精读系列(1)【抑郁对大脑神经影响和对脊椎损伤患者运动恢复的影响探究】

Depression mediated the relationships between precentral-subcortical causal links and motor recovery in spinal cord injury patients 手动防爬虫&#xff0c;原创作者CSDN&#xff1a;总是重复名字我很烦啊&#xff0c;联系邮箱daledeng123163.com直达原文 这是一篇收…

操作系统——操作系统用户界面

0.关注博主有更多知识 操作系统入门知识合集 目录 3.1操作系统启动过程 3.1.1BIOS和主引导记录MBR 思考题&#xff1a; 3.1.2操作系统的启动过程 思考题&#xff1a; 3.2用户界面 3.2.1用户界面概念 思考题&#xff1a; 3.2.2系统调用 3.1操作系统启动过程 3.1.1BIO…

【五一创作】使用Resnet残差网络对图像进行分类(猫十二分类,模型定义、训练、保存、预测)(一)

使用Resnet残差网络对图像进行分类 &#xff08;猫十二分类&#xff0c;模型定义、训练、保存、预测&#xff09;(一&#xff09; 目录 一、项目简介 二、环境说明 1、安装库 2、导入需要的库 三、分类过程 &#xff08;1&#xff09;、解压数据集 &#xff08;2&#xf…

Spring中的Bean

1. Bean的配置 Spring 可以被看作是一个大型工厂&#xff0c;这个工厂的作用就是生产和管理 Spring 容器中的Bean。如果想要在项目中使用这个工厂&#xff0c;就需要开发者对Spring 的配置文件进行配置。 Spring 容器支持XML 和 Properties 两种格式的配置文件&#xff0c;在实…

【Python Web】Flask超实用基础知识总结(内附代码)

Flask是一种轻量级Web应用框架&#xff0c;使用Python编写。它是一个简单易用的框架&#xff0c;适合构建小型到中型的Web应用程序。Flask提供了基本的Web开发功能&#xff0c;如路由、请求处理、模板渲染、文件上传等。 下面是Flask的一些基础语法 文章目录 1.静态文件处理2.…

【建议收藏】计算机视觉是什么?这几个计算机视觉的核心任务你真的了解吗?

文章目录 &#x1f4da;引言&#x1f4d6;计算机视觉的核心任务&#x1f4d1;图像分类和对象识别&#x1f4d1;目标检测&#x1f4d1;语义分割&#x1f4d1;实例分割&#x1f4d1;图像生成 &#x1f4d6;计算机视觉的应用领域&#x1f4d1;人脸识别&#x1f4d1;自动驾驶&#…

【论文阅读】LORA: LOW-RANK ADAPTATION OF LARGE LAN- GUAGE MODELS

3.最近很多工作好像都绕不开lora&#xff0c;无论是sd还是llm.... 1. 背景 问题&#xff1a;大模型重新训练所有模型参数的完全微调变得不太可行。lora在做什么 我们提出了低秩自适应&#xff0c;即LoRA&#xff0c;它冻结预先训练的模型权重&#xff0c;并将可训练的秩分解矩…

高级数据结构 Trie树(字典树)

高级数据结构 Trie树&#xff08;字典树&#xff09; &#xff08;Trie Tree&#xff09;字典树_Rkun18的博客-CSDN博客 字典树节点表示 #define TRIE_MAX_CHAR_NUM 26 //这里你可以自由设置 根据不同需求设置 如果有大小或者其他符号你就需要增大这个数字struct TrieNode{T…

在amd64与arm上用paddlelite部署paddelOCR(Ascend硬件)

由于部署的硬件是华为昇腾 NPU&#xff08;Ascend310&#xff09;&#xff0c;参考网址https://www.paddlepaddle.org.cn/lite/v2.10/demo_guides/huawei_ascend_npu.html#npu-paddle-lite 先拉取paddlelite用来编译库 git clone https://github.com/PaddlePaddle/Paddle-Lit…

2. Java 异常体系

2.1 Throwable java.lang.Throwable 类是 Java 程序执行过程中发生的异常事件对应的类的根父类。 Throwable 中的常用方法&#xff1a; public void printStackTrace()&#xff1a;打印异常的详细信息。 包含了异常的类型、异常的原因、异常出现的位置、在开发和调试阶段都得…

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术

倾斜摄影超大场景的三维模型轻量化纹理压缩的关键技术 倾斜摄影超大场景的三维模型轻量化处理中纹理压缩是轻量化处理的重要手段之一&#xff0c;可以在保证模型真实感的前提下&#xff0c;减小数据体积、降低传输带宽和提高渲染性能。以下是几个关键的纹理压缩技术&#xff1a…

自然语言处理知识抽取(pkuseg、DDParser安装及使用)

一、分词简介 1.基本概念 分词是自然语言处理中的一个重要步骤&#xff0c;它可以帮助我们将文本分成一个个词语&#xff0c;以便更好地理解和分析文本。在计算机视觉、语音识别、机器翻译等领域&#xff0c;分词都扮演着重要的角色。 目前&#xff0c;常用的分词库包括 jie…

搭建Redis主从集群+哨兵+代理predixy

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、Redis是什么&#xff1f;二、搭建Redis集群步骤1.环境和版本2.Redis 安装部署3.主从同步配置4.哨兵模式配置5.代理predixy配置 总结 前言 提示&#xff1a…