链表OJ题(4)

目录

10.链表的回文结构

11.随机链表的复制


🙂找中间节点一定要考虑偶数个和奇数个的问题。

🙂指针指向的前中后。

🙂链表节点的位置个数/链表的节点中的数字。🆗🆗

今天最后两道链表OJ题目。

10.链表的回文结构

描述

对于一个链表,请设计一个时间复杂度为O(n),额外空间复杂度为O(1)的算法,判断其是否为回文结构。给定一个链表的头指针A,请返回一个bool值,代表其是否为回文结构。保证链表长度小于等于900。

测试样例: 


 【快慢指针中间节点+逆置链表+比较链表】

  • 先找到链表的中间节点(分奇偶)
  • 逆置后半段链表
  • 两个指针比较两个链表
  • 结束条件,某个指正为NULL就结束
/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};*/
class PalindromeList {
public:

    bool chkPalindrome(ListNode* A) {
        //找中间节点
        ListNode*slow=A;
        ListNode*fast=A;
        while(fast->next && fast)
        {
            fast=fast->next->next;
            slow=slow->next;
        }
        //逆置后半段链表
        ListNode*head=slow;
        ListNode*rhead=NULL;
        ListNode*cur=head;
        ListNode*tail=NULL;
        while(cur)
        {
            ListNode*tmp=cur->next;
            if(rhead == NULL)
            {
                rhead=tail=cur;
                rhead->next=NULL;
            }
            else 
            {
                rhead=cur;
                rhead->next=tail;
                tail=rhead;
            }
            cur=tmp;
        }
        //比较rhead
        while(rhead && A)
        {
            if(rhead->val != A->val)
            {
                return false;
            }
            rhead=rhead->next;
            A=A->next;
        }
        return true;
        }

    };


11.随机链表的复制(链表的深度拷贝)

给你一个长度为 n 的链表,每个节点包含一个额外增加的随机指针 random ,该指针可以指向链表中的任何节点或空节点。

构造这个链表的 深拷贝。 深拷贝应该正好由 n 个 全新 节点组成,其中每个新节点的值都设为其对应的原节点的值。新节点的 next 指针和 random 指针也都应指向复制链表中的新节点,并使原链表和复制链表中的这些指针能够表示相同的链表状态。复制链表中的指针都不应指向原链表中的节点 

例如,如果原链表中有 X 和 Y 两个节点,其中 X.random --> Y 。那么在复制链表中对应的两个节点 x 和 y ,同样有 x.random --> y 。

返回复制链表的头节点。

用一个由 n 个节点组成的链表来表示输入/输出中的链表。每个节点用一个 [val, random_index] 表示:

  • val:一个表示 Node.val 的整数。
  • random_index:随机指针指向的节点索引(范围从 0 到 n-1);如果不指向任何节点,则为  null 。

你的代码  接受原链表的头节点 head 作为传入参数。

示例一: 

 

 示例二:


【 尾插+某个位置插入】

  • 这道题目的综合性还挺强的,大家一定要把前面链表的知识扎根。才能轻易上手。
  • 单链表+随机链表(随机链表可以指向其他任何链表包括自己)
/**
 * Definition for a Node.
 * struct Node {
 *     int val;
 *     struct Node *next;
 *     struct Node *random;
 * };
 */

struct Node* copyRandomList(struct Node* head) 
{
    //第一步
    struct Node*cur=head;
    while(cur)
    {
        struct Node*copy=(struct Node*)malloc(sizeof(struct Node));
        copy->val = cur->val;
        copy->next=cur->next;
        cur->next=copy;
        cur=cur->next->next;
    }
    //第二步
    cur=head;
    while(cur)
    {
        struct Node*copy=cur->next;
        if(cur->random == NULL)
        {
            copy->random=NULL;
        }
        else
        {
            copy->random=cur->random->next;
        }
        cur=cur->next->next;
    }
    //第三步
    cur=head;
    struct Node*newhead=NULL;
    struct Node*tail=NULL;
    while(cur)
    {
        struct Node*copy=cur->next;
        if(newhead == NULL)
        {
            newhead=tail=cur->next;
        }
        else
        {
            tail->next=cur->next;
            tail=tail->next;
        }
        cur->next=copy->next;
        cur=cur->next->next;
    }
    return newhead;
}//❌

 


 【找具体位置第几个】

但是这个方法的时间复杂度是O(N^2),时间复杂度是非常高的,建议学会上面的方法。 

12.链表逆置(头插)和链表顺序(尾插) 

【头插】 

struct ListNode* reverseList(struct ListNode* head)
{
    struct ListNode*newhead=NULL;
    struct ListNode*cur=head;
    while(cur)
    {
        struct ListNode*tmp=cur->next;
        cur->next=newhead;
        newhead=cur;
        cur=tmp;
    }
    return newhead;
}

【尾插】

struct ListNode* removeElements(struct ListNode* head, int val) 
{
    struct ListNode* cur=head;
    struct ListNode* tail=NULL;
    struct ListNode* newhead=NULL;
    while(cur)
    {
        if(cur->val != val)
        {
            if(tail)
            {
                tail->next=cur;//易错
                tail=tail->next;
            }
            //处理头
            else
            {
                newhead=tail=cur;//易错
            }
            cur=cur->next;
        }
        else
        {
            struct ListNode* tmp=cur->next;
            free(cur);
            cur=tmp;
        }
    }
    //处理尾
    if(tail)
    {
        tail->next=NULL;
    }
    return newhead;
}

最近天气渐冷,大家要注意保暖哦。

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

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

相关文章

<MySQL> MySQL表数据的 CRUD 基础操作 —— 增(Create)、查(Retrieve)、改(Update)、删(Delete)

目录 一、CRUD 二、增加(Create) 2.1 新增插入数据 insert 2.2 操作演示 2.3 多行插入更高效 2.4 插入时间类型的数据 2.5 使用“库函数” 三、查询(Retrieve) 四、修改(Update) 4.1 修改数据 …

Linux如何修改主机名(hostname)(亲测可用)

文章目录 背景Linux如何修改主机名(hostname)方法方法1. 使用 hostnamectl 命令示例 2. 编辑 /etc/hostname 文件注意事项 背景 我创建虚拟机的时候没设置主机名,现在显示localhost,有点尴尬😅: 需要重新设…

55基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声

基于matlab的1.高斯噪声2.瑞利噪声3.伽马噪声4.均匀分布噪声5.脉冲(椒盐)噪声五组噪声模型,程序已调通,可直接运行。 55高斯噪声、瑞利噪声 (xiaohongshu.com)

Java Web——前端HTML入门

目录 HTML&CSS3&JavaScript简述 1. HTML概念 2. 超文本 3. 标记语言 4. HTML基础结构 5. HTML基础词汇 6. HTML语法规则 7. VS Code 推荐使用的插件 8. 在线帮助文档 HTML&CSS3&JavaScript简述 HTML 主要用于网页主体结构的搭建,像一个毛坯…

基于springboot实现桥牌计分管理系统项目【项目源码】计算机毕业设计

基于springboot实现桥牌计分管理系统演示 JAVA简介 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&#…

【408】计算机学科专业基础 - 数据结构

数据结构知识 绪论 数据结构在学什么 如何用程序代码把现实世界的问题信息化 如何用计算机高效地处理这些信息从而创造价值 数据结构的基本概念 什么是数据: 数据是信息的载体,是描述客观事物属性的数、字符及所有能输入到计算机中并被计算机程序…

FFmpeg简介1

适逢FFmpeg6.1发布,准备深入学习下FFmpeg,将会写下系列学习记录。 在此列出主要学习资料,后续再不列,感谢这些大神的探路和分享,特别是雷神,致敬! 《FFmpeg从入门到精通》 《深入理解FFmpeg》 …

基恩士软件的基本指令(二)

目录 基础指令 输入输出常开常闭指令 “A软元件名称--装入快捷键” “O软元件名称--输出快捷键” “ALT回车--连线快捷键” “B软元件--常闭接点” “软元件“/”--切换常开/常闭接点状态” 上升沿下降沿指令 “P-软元件回车--上升沿输入方法” “F-软元件回车--下降沿输入…

[工业自动化-16]:西门子S7-15xxx编程 - 软件编程 - 西门子仿真软件PLCSIM

目录 前言: 一、PLCSIM仿真软件 1.1 PLCSIM仿真软件基础版(内嵌) 1.2 PLCSIM仿真软件与PLCSIM仿真软件高级版的区别? 1.3 PLCSIM使用 前言: PLC集成开发环境是运行在Host主机上,Host主机与PLC可以通过…

NestJS——基于Node.js 服务器端应用程序的开发框架

文章目录 前言什么是 NestJS? 一、NestJS特性?二、使用步骤Typescript 知识后端开发基本知识新建项目目录结构 前言 Nestjs中文文档 什么是 NestJS? Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用…

【ATTCK】MITRE Caldera -前瞻规划器

CALDERA是一个由python语言编写的红蓝对抗工具(攻击模拟工具)。它是MITRE公司发起的一个研究项目,该工具的攻击流程是建立在ATT&CK攻击行为模型和知识库之上的,能够较真实地APT攻击行为模式。 通过CALDERA工具,安全…

【微软技术栈】C#.NET 如何使用本地化的异常消息创建用户定义的异常

本文内容 创建自定义异常创建本地化异常消息 在本文中,你将了解如何通过使用附属程序集的本地化异常消息创建从 Exception 基类继承的用户定义异常。 一、创建自定义异常 .NET 包含许多你可以使用的不同异常。 但是,在某些情况下,如果它们…

elastic-job 完结篇

一 elastic-job 1.1 案例场景分析 1.设置4个分片,10秒执行一次。 分片弹性扩容缩容机制测试: 测试1:测试窗口1不关闭,再次运行main方法查看控制台日志,注意修改application.properties中的 server.port&#xf…

机器学习数据预处理——Word2Vec的使用

引言: Word2Vec 是一种强大的词向量表示方法,通常通过训练神经网络来学习词汇中的词语嵌入。它可以捕捉词语之间的语义关系,对于许多自然语言处理任务,包括情感分析,都表现出色。 代码: 重点代码&#…

删除杀软回调 bypass EDR 研究

01 — 杀软或EDR内核回调简介 Windows x64 系统中,由于 PatchGuard 的限制,杀软或EDR正常情况下,几乎不能通过 hook 的方式,完成其对恶意软件的监控和查杀。那怎么办呢?别急,微软为我们提供了其他的方法&a…

Halcon WPF 开发学习笔记(4):Halcon 锚点坐标打印

文章目录 专栏前言锚点二次开发添加回调函数辅助Model类 下集预告 专栏 Halcon开发 博客专栏 WPF/HALCON机器视觉合集 前言 Halcon控件C#开发是我们必须掌握的,因为只是单纯的引用脚本灵活性过低,我们要拥有Halcon辅助开发的能力 锚点开发是我们常用的…

Javaweb之javascript的小案例的详细解析

1.5.4 案例 1.5.4.1 需求说明 鲁迅说的好,光说不练假把式,光练不说傻把式。所以接下来我们需要通过案例来加强对于上述DOM知识的掌握。需求如下3个: 点亮灯泡 将所有的div标签的标签体内容后面加上:very good 使所有的复选框呈现被选中的…

基于springboot实现驾校管理系统项目【项目源码】

基于springboot实现驾校管理系统演示 JAVA简介 JavaScript是一种网络脚本语言,广泛运用于web应用开发,可以用来添加网页的格式动态效果,该语言不用进行预编译就直接运行,可以直接嵌入HTML语言中,写成js语言&#xff0…

2.4.0 Milky Way 强势登场!新功能大爆炸,让你High翻全场!

Yo开发达人们,我们有重磅新功能要给你们放送啦! Check it out 数据汇总不再单调,新的聚合函数登场! compact_state_agg #1359gauge_agg #1370first #1395last #1413mode #1440increase #1476delta #1395time_delta #1405rate #14…