当前位置: 首页 > news >正文

24/07/10数据结构(5.1213)链表OJ

继续练习题:

7.判断链表是不是回文结构

对于一个链表,设计一个时间复杂度O(n)空间复杂度O(1)的算法,判断是否为回文结果

给定一个链表的头指针A,返回一个bool值代表其是否为回文结构.

测试样例:1->2->2->1

返回:ture

bool chkPalindrome(ListNode* A){
        //找到中间节点
        if (A == NULL || A->next == NULL)
            return ture;
        ListNode* fast, *slow;
        fast = slow = A;
        while (fast && fast->next){
            slow = slow->next;
            fast = fast->next->next;
        }
        ListNode* prev = NULL;
        ListNode* cur = slow;
        //逆转
        while (cur){
            ListNode* next = cur->next;
            //头插
            cur->next = prev;
            prev = cur;

            cur = next;

        }
        //比较
        while (A && prev){
            if (A->val != prev->val)
                return false;
            A = A->next;
            prev = prev->next;
        }
        return ture;

    }

8.输入两个链表,找出它们第一个相交的节点

struct ListNode* getIntersectionNode(struct List* headA,
struct ListNode* headB){
    int lenA = 0;
    int lenB = 0;
    struct ListNode* curA = headA, *curB = headB;
    while (curA){
        ++lenA;
        curA = curA->next;
    }
    while (curB){
        ++lenB;
        curB = curB->next;
    }

    int gap = abs(lenA - lenB);
    //首先让长链表先走gap步
    struct listNode* longList = headA, *shortList = headB;
    if (lenB > lenA){
        longList = headB;
        shortList = headA;
    }
    while (gap--){
        longList = longList->nest;
    }
    //两个链表同时遍历
    while (longList && shortList){
        //判断是否同一个节点:比较节点的地址
        if (longList == shortList)
            return longList;
        longList = longList->next;
        shortList = shortList->next;
    }
    return NULL;
}

9.给定一个链表,判断链表中是否有环

要求:如果链表中有某节点,可以通过连续跟踪next指针再次到达,则链表中存在环.为了表示给定链表中的环,我们使用证书pos来表示链表尾链接到链表中的位置(索引从0开始).如果pos是-1,则在该链表中没有环.注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况.如果链表中存在环,则返回ture,否则返回false.

快慢指针:fast:每次走两步slow:每次走一步

fast:NULL --> 没有环

fast == slow -->有环

bool hasCycle(struct ListNode* head){
    struct ListNode* fast, *slow;
    fast = slow = head;
    while (fast && fast->naxt){
        fast = fast->next->next;
        slow = slow->next;

        if (fast == slow)
            return ture;
    }
    return  false;
}

10.给定一个链表,返回链表开始入环的第一个节点.如果链表无环,则返回NULL.

思路:假设环的长度C 入口节点到相遇点的距离X 起点到入口点的距离 L

慢指针走过的节点个数:L+X

快指针走过的节点数:L+X+N * C(N > 0)

快指针节点个数 = 2 * 慢指针节点个数

解得(N - 1)C + C - X = L

//获取相遇点
struct ListNode* listCycle(struct ListNode* nead){
    struct ListNode* fast, *slow;
    fast = slow = head;
    while (fast && fast->next){
        fast = fast->next->next;
        slow = slow->next;
        if (fast == slow){
            return fast;
        }
        return NULL;
    }
    struct ListNode* detectCyle(struct ListNode* head){
        struct ListNode* node = listCycle(head);
        if (node){
            //分别从相遇点和起点开始走,每次走一步
            while (node){
                if (node == head){
                    return node;
                }
                node = node->next;
                head = head->next;
            }
        }
        return NULL;
    }
}

11.给定一个链表,每个节点包含一个额外增加的随机指针,该指针可以指向链表中任何节点或者空节点.要求返回这个链表的深度拷贝

拷贝数据:新的数据存放元素链表中,存放在当前需要拷贝的数据的next位置

拷贝random指向:拷贝当前指针的下一个地址copy->next = cur->random->next

拆链:

struct node* copyRandomList(struct Node* head){
    if (head == NULL);
    return head;
    //1.拷贝数据
    struct Node* cur = head;
    while (cur){
        struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
        newNode->val = cur->val;
        struct Node* next = cur->next;
        cur->next = newNode;
        newNode->next = next;
        cur = next;
    }
    //2.拷贝random
    cur = head;
    while (cur){
        struct Node* copy = cur->next;
        if (cur->random)
            copy->random = cur->random->next;
        else
            copy->random = NULL;
    }
    //3.拆链
    struct Node* newHead = NULL;
    cur = head;
    while (cur){
        struct Node* copy = cur->next;
        struct Node* next = copy->next;
        if (newHead == NULL)
            newHead = copy;
        cur->next = next;
        if (next)
            copy->next = next->next;
        else
            copy->next = NULL;
        cur = copy->next;
        

    }
    return newHead;

}

12.对链表进行插入排序

插入排序:在已经排好的序列中,插入新的数据.前提/假设:第一个数据是有序的.插入过程:待插入的数据从有序序列的最后一个位置开始向前遍历,找到一个前一个比他小或者等于的数据,待插入的数据放入次数据的后面.

/*
 Definition for singly-linked list.
 struct ListNode{
 int val;
 ListNode* next;
 ListNode(int x) : val(x),next(NULL){};
 };
*/

class Solution{
public:
    ListNode* insertionSortList(ListNode* head){
        if (head == NULL || head->next == NULL)
            return head;
        //假设第一个数据有序
        struct ListNode* tail, *cur, *prev, *node;
        //tail:有序链表的尾节点
        tail = head;
        cur = head->next;
        while (cur){
            //如果待插入数据小于有序数据的最后一个数据需要遍历
            if (cur ->val < tail->val){
                //从头结点开始遍历
                prev = NULL;
                node = head;
                //从有序数据中找到第一个大于待插入数据的位置
                while (node && node->val <= cur->val){
                    prev = node;
                    node = node->next;
                }
                //prev cur node
                tail->next = cur->next;
                cur->next = node;
                if (prev)
                    prev->next = cur;
                else
                    head = cur;
                //排序下一个数据
                cur = tail->next;
            }
            else{
                tail = tail->next;
                cur = tail->next;
            }
        }
        return head;
    }
};
 

链表相关的题还可以多刷等有整体吸收了再刷题.

相关文章:

24/07/10数据结构(5.1213)链表OJ

继续练习题: 7.判断链表是不是回文结构 对于一个链表,设计一个时间复杂度O(n)空间复杂度O(1)的算法,判断是否为回文结果 给定一个链表的头指针A,返回一个bool值代表其是否为回文结构. 测试样例:1->2->2->1 返回:ture bool chkPalindrome(ListNode* A){ …...

C++ 入门基础:开启编程之旅

引言 C 是一种高效、灵活且功能强大的编程语言&#xff0c;广泛应用于系统软件、游戏开发、嵌入式系统、科学计算等多个领域。作为 C 语言的扩展&#xff0c;C 不仅继承了 C 语言的过程化编程特性&#xff0c;还增加了面向对象编程&#xff08;OOP&#xff09;的支持&#xff…...

据传 OpenAI秘密研发“Strawberry”项目

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

简单的SQL字符型注入

目录 注入类型 判断字段数 确定回显点 查找数据库名 查找数据库表名 查询字段名 获取想要的数据 以sqli-labs靶场上的简单SQL注入为例 注入类型 判断是数字类型还是字符类型 常见的闭合方式 ?id1、?id1"、?id1)、?id1")等&#xff0c;大多都是单引号…...

HttpClient调用SpringBoot项目的文件上传接口实现文件上传

1.导入httpclient的jar包 这里导入了httpclient、httpmime11 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:sch…...

[leetcode]kth-smallest-element-in-a-sorted-matrix 有序矩阵中第k小元素

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:bool check(vector<vector<int>>& matrix, int mid, int k, int n) {int i n - 1;int j 0;int num 0;while (i > 0 && j < n) {if (matrix[i][j] < mid) {num i 1;j;…...

【经典面试题】是否形成有环链表

1.环形链表oj 2. oj解法 利用快慢指针&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; bool hasCycle(struct ListNode *head) {ListNode* slow head, *fast…...

Flask 用 Redis 缓存键值对-实例

Flask 使用起 Redis 来简直就是手到擒来&#xff0c;比 MySQL 简单多了&#xff0c;不需要那么多配置&#xff0c;实际代码就这么多&#xff0c;直接复制就能用。除了提供简单实用的实例以外&#xff0c;本文后面还会简单介绍一下 Redis 的安装与使用&#xff0c;初学者也能一看…...

我的世界1.21多种服务端开服教程,原版/Forge/Fabric/Paper/Mohist...,Minecraft开服教程

Minecraft&#xff08;MC&#xff09;1.21版多种服务端开服教程&#xff0c;我的世界1.21服务器搭建教程&#xff0c;MC原版/Forge/Fabric/Paper/Mohist服务端搭建教程&#xff0c;我的世界MOD/插件服开服教程。 本教程使用 Linux系统MCSManager 面板来搭建Minecraft服务器。 …...

docker安装nginx并配置https

参考 docker安装nginx并配置https-腾讯云开发者社区-腾讯云 (tencent.com) 证书的生成 参见&#xff1a;SpringBoot项目配置HTTPS接口的安全访问&#xff08;openssl配置&#xff09;_配置接口访问-CSDN博客 步骤 1: 拉取Nginx镜像 docker pull nginx 好使的镜像如下&#x…...

永磁同步电机控制算法--基于 SVM 的无磁链环 DTC

永磁同步电机无磁链环 DTC 通过控制定子磁链交轴分量来直接控制转矩&#xff0c;不再要求控制磁链幅值恒定&#xff0c;省去了传统 DTC 中的磁链环&#xff0c;不仅转矩响应更快&#xff0c;有效抑制了转矩脉动&#xff0c;而且提高了电机功率因数。但无磁链环 DTC 方案仍采用传…...

如何避免在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题

在 Docker 容器中遇到 MAC 地址冲突和 IP 地址冲突的问题时&#xff0c;通常是由于 Docker 在分配网络资源时出现了一些问题。虽然这种情况并不常见&#xff0c;但仍有可能发生。以下是一些原因和可能的解决方案&#xff1a; 原因分析 Docker 版本问题&#xff1a;某些 Docke…...

arm64架构下源码编译安装kafka —— 筑梦之路

一般来说&#xff0c;直接使用官方提供的二进制文件即可&#xff0c;没有必要使用源码编译安装的方式&#xff0c;而对于有特殊用途的&#xff0c;选择源码编译安装无疑是更好地选择。比如修改源码实现想要的功能&#xff0c;mirrormaker2保持topic名称不变。 git clone https…...

LabVIEW前面板占满整个屏幕(转)

希望在运行一个LabVIEW程序时&#xff0c;它的前面板能够占据整个屏幕&#xff0c;且不显示Windows的任务栏或其他任何的LabVIEW菜单选项。怎样才能实现这一功能&#xff1f; 您可以通过手动配置或编程的方式实现该功能。 手动配置VI属性 您可以通过以下操作&#xff0c;将…...

Promise.all、any、race和allSettled的相同点与不同点与应用场景

在JavaScript中&#xff0c;Promise对象是一种处理异步操作的方式。它允许我们以一种更优雅的方式来处理异步代码&#xff0c;而不是使用回调函数。在Promise中&#xff0c;有一些方法可以帮助我们更好地管理多个Promise实例&#xff0c;这些方法包括Promise.all、Promise.any、…...

Ubuntu下如何设置程序include搜索路径及链接路径

添加库的include及lib路径 linux下系统默认路径为 /usr/include, /usr/local/include, gcc在编译程序时会按照当前目录路径->系统默认路径->系统环境变量的路径方式去查找&#xff0c;所以当我们想调用的库未安装在系统默认路径时&#xff0c;我们可以通过手动添加环境变…...

FLinkCDC引起的生产事故(二)

背景&#xff1a; 最近在做实时数据的抽取工作&#xff0c;利用FLinkCDC实时抽取目标库Oracle的数据到Doris中&#xff0c;但是在抽取的过程中&#xff0c;会导致目标库的生产库数据库非常卡顿&#xff0c;为了避免对生产环境的数据库造成影响&#xff0c;对生产环境的数据库利…...

【产品经理】WMS多仓调拨转移说明

对于仓储管理来说&#xff0c;越来越多企业开始应用WMS进行系统化的管理&#xff0c;以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍&#xff0c;希望对你有帮助。 一、业务流程 。在线下业务流程拓展&#xff0c;仓库不断增多的过程中&#xff0c;由于…...

每日一练:奇怪的TTL字段(python实现图片操作实战)

打开图片&#xff0c;只有四种数字&#xff1a;127&#xff0c;191&#xff0c;63&#xff0c;255 最大数字为255&#xff0c;想到进制转换 将其均转换为二进制&#xff1a; 发现只有前2位不一样 想着把每个数的前俩位提取出来&#xff0c;组成新的二进制&#xff0c;然后每…...

【Java开发实训】day03——方法的注意事项

目录 一、方法的基本概念 二、void和return关键字 三、单一返回点原则 四、static方法使用说明 &#x1f308;嗨&#xff01;我是Filotimo__&#x1f308;。很高兴与大家相识&#xff0c;希望我的博客能对你有所帮助。 &#x1f4a1;本文由Filotimo__✍️原创&#xff0c;首发于…...

June安全防护手册:保护你的论坛免受常见Web攻击的10个技巧

June安全防护手册&#xff1a;保护你的论坛免受常见Web攻击的10个技巧 【免费下载链接】june June is a forum (Deprecated) 项目地址: https://gitcode.com/gh_mirrors/ju/june 在当今数字时代&#xff0c;论坛安全防护已成为每个网站管理员必须面对的重要课题。June作…...

通过Docker部署FastAPI应用程序

&#x1f31e;欢迎来到PyTorch深度学习实战的世界 &#x1f308;博客主页&#xff1a;卿云阁 &#x1f48c;欢迎关注&#x1f389;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; &#x1f4c6;首发时间&#xff1a;&#x1f339;2026年5月24日&#x1f339; ✉️希望可以和大家…...

Unity游戏实时翻译工程化实践:从XUnity.AutoTranslator配置到本地化流水线构建

1. 这不是“加个插件就完事”的翻译方案&#xff0c;而是游戏本地化工程的起点你刚在Unity Asset Store里搜到XUnity.AutoTranslator&#xff0c;点开文档看到“支持实时翻译”“自动注入UI文本”&#xff0c;心里一热&#xff1a;终于能绕过繁琐的多语言资源表管理&#xff0c…...

PostgreSQL COPY命令:高效数据导入的最佳实践

引言 在处理大量数据插入场景时&#xff0c;传统的INSERT语句往往会成为性能瓶颈。PostgreSQL提供了COPY命令&#xff0c;能够显著提升数据导入效率。本文将深入探讨COPY命令的工作原理、使用方法以及为什么它比普通INSERT更快。 什么是COPY命令&#xff1f; COPY是PostgreSQL提…...

面试最后 5 分钟,别只会说“我没有问题了”

很多应届生面试到最后&#xff0c;都会遇到一个问题&#xff1a;“我的问题问完了&#xff0c;你还有什么想问我的吗&#xff1f;”这句话听起来像是面试快结束了&#xff0c;实际上往往是最后一个观察点。你说“没有了”&#xff0c;不一定会直接扣分&#xff0c;但基本等于把…...

2026照片去水印免费软件App推荐,详细教程一看就会

你是不是也遇到过这种情况&#xff1f;刷到一张特别喜欢的照片想保存当壁纸&#xff0c;结果右下角一个巨大的水印直接毁了整张图&#xff1b;或者做PPT需要用到某张素材图&#xff0c;翻遍了相册发现都有平台Logo&#xff0c;怎么裁都裁不掉。想找免费的去水印工具&#xff0c…...

卖瓦楞纸箱怎么找客户?下游工厂在哪里

卖瓦楞纸箱找客户&#xff0c;本质是找用箱量大的下游工厂&#xff0c;核心难点是拿到这些工厂的名单和联系人——因为纸箱是本地化极强的耗材&#xff0c;客户往往就在方圆 100 到 200 公里内&#xff0c;谁先把本地下游工厂版图盘清楚&#xff0c;谁就掌握了竞争主动权。 用箱…...

基于决策树与Boosting的暗网流量多阶段分类系统设计与实践

1. 项目概述&#xff1a;为什么暗网流量分类是个“硬骨头”&#xff1f;在网络安全这个没有硝烟的战场上&#xff0c;流量分类技术就像是前沿阵地的“雷达”和“声呐”。它的任务很简单&#xff1a;从海量、混杂的网络数据流中&#xff0c;快速、准确地识别出哪些是正常的网页浏…...

混沌系统预测方法全景评测:从线性回归到神经ODE的实战指南

1. 项目概述&#xff1a;混沌系统预测的“兵器谱”与实战评测在动力系统建模和时间序列预测这个行当里混了十几年&#xff0c;我见过太多同行面对混沌系统时那种“既爱又恨”的复杂心情。爱的是它背后深刻的物理内涵和广泛的应用前景&#xff0c;从大气湍流到金融市场&#xff…...

Android HTTPS抓包原理与HTTPCanary证书配置全解

1. 这不是“绕过”&#xff0c;而是理解Android HTTPS抓包的底层逻辑HTTPCanary 是 Android 平台上少有的、真正能稳定抓取 HTTPS 流量的本地代理工具。但几乎所有新手在首次使用时都会卡在同一个地方&#xff1a;明明安装了 HTTPCanary 自带的证书&#xff0c;App 依然拒绝建立…...