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;
    }
};
 

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

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

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

相关文章

win10系统更新后无法休眠待机或者唤醒,解决方法如下

是否使用鼠标唤醒 是否使用鼠标唤醒 是否使用键盘唤醒

unity 手动制作天空盒及使用

提示&#xff1a;文章有错误的地方&#xff0c;还望诸位大神不吝指教&#xff01; 文章目录 前言一、使用前后左右上下六张图1.准备6张机密结合的图片2.创建Material材质球3.使用天空盒 二、使用HDR贴图制作1.准备HDR贴图2.导入unity 修改Texture Sourpe 属性3.创建材质球4.使用…

【java计算机毕设】基于J2EE的仓库管理系统设计与开发源码带文档MySQL ssm vue maven前后端可分离也可不分离

目录 1项目功能 2项目介绍 3项目地址 1项目功能 2项目介绍 系统功能&#xff1a; 仓库管理系统包括管理员、员工俩种角色。 管理员功能包括个人中心模块用于修改个人信息和密码、管理员管理、仓库信息管理、基础数据管理功能模块有仓库类型管理和物资类型管理、物资信息管理…

使用xpath获取网页内容

使用xpath获取网页内容 安装 lxml 库 pip install lxml示例 from lxml import etreeurl = f"" respon = requests.get(url=url, verify=False).content.decode() htm

力扣1541.平衡括号字符串的最少插入次数

力扣1541.平衡括号字符串的最少插入次数 记录左括号数量 当遍历到**(只考虑第一个)**右括号时首先判断是否有左括号再判断接下来还有没有右括号 class Solution {public:int minInsertions(string s) {int res0;int lc 0;int n s.size();int i 0;while(i<n){char c s…

GLM3源码学习

原文链接&#xff1a;chatglm源码学习 GLM3源码&#xff1a;https://github.com/THUDM/ChatGLM3 我们直接从openai_api_demo入手&#xff0c;因为api_demo一般是nlp模型后端核心功能实现的部分 openai_api_demo源码 api_server.py api_server.py是提供web api接口的入口文件…

【面试题】Golang 之Channel底层原理 (第三篇)

目录 1.常见channel三大坑&#xff1a;死锁、内存泄漏、panic 1.死锁 1.只有生产者&#xff0c;没有消费者&#xff0c;或者反过来 2 生产者和消费者出现在同一个 goroutine 中 3 buffered channel 已满&#xff0c;且在同一个goroutine中 2.内存泄露 1 如何实现 gorout…

CSS学习碎碎念之卡片展示

效果展示&#xff1a; 代码展示 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>图片展示</title…

Android C++系列:Linux网络(三)协议格式

1. 数据包封装 传输层及其以下的机制由内核提供,应用层由用户进程提供(后面将介绍如何使用 socket API编写应用程序),应用程序对通讯数据的含义进行解释,而传输层及其以下 处理通讯的细节,将数据从一台计算机通过一定的路径发送到另一台计算机。应用层 数据通过协议栈发到…

《Linux系统编程篇》vim的使用 ——基础篇

引言 上节课我们讲了&#xff0c;如何将虚拟机的用户目录映射到自己windows的z盘&#xff0c;虽然这样之后我们可以用自己的编译器比如说Visual Studio Code&#xff0c;或者其他方式去操作里面的文件&#xff0c;但是这是可搭建的情况下&#xff0c;在一些特殊情况下&#xf…

C# 使用 NPOI 处理Excel,导入单元格内容是公式的处理

在C#中使用NPOI库处理Excel文件时&#xff0c;如果单元格内容包含公式&#xff0c;NPOI能够读取这些公式以及它们计算后的值。NPOI是一个开源的.NET库&#xff0c;用于处理Microsoft Office文档&#xff0c;特别是Excel文件&#xff08;.xls和.xlsx&#xff09;。 要处理包含公…

【小超嵌入式】C++猜数字游戏详细分析

一、程序源码 #include <iostream> #include <cstdlib> #include <ctime>using namespace std;int main() {srand(static_cast<unsigned int>(time(0))); // 随机数种子int targetNumber rand() % 100 1; // 生成 1 到 100 之间的随机数int guess…

helm系列之-构建自己的Helm Chart

构建自己的Helm Chart 一般常见的应用&#xff08;nginx、wordpress等&#xff09;公有的helm仓库都提供了chart&#xff0c;可以直接安装或者自定义安装。下面实践从零构建自己的helm chart应用。 准备工作 准备一个用于部署测试的应用镜像并推送到镜像仓库。 应用代码 这…

Linux 命令个人学习笔记

1. 操作目录的命令 (1) ls : 查看指定目录中, 都有哪些内容 直接输入 ls 是查看当前目录中的内容. 还可以给 ls 后面加上一个路径(绝对/相对), 就可以查看指定目录中的内容 比如看根目录(刚安装Centos下) ls / 根目录的地位类似于Java中的Object ls -l 详细查看当前文件的内容…

(十一) Docker compose 部署 Mysql 和 其它容器

文章目录 1、前言1.1、部署 MySQL 容器的 3 种类型1.2、M2芯片类型问题 2、具体实现2.1、单独部署 mysql 供宿主机访问2.1.1、文件夹结构2.1.2、docker-compose.yml 内容2.1.3、运行 2.2、单独部署 mysql 容器供其它容器访问&#xff08;以 apollo 为例&#xff09;2.2.1、文件…

pyinstaller教程(二)-快速使用(打包python程序为exe)

1.介绍 PyInstaller 是一个强大的 Python 打包工具&#xff0c;可以将 Python 程序打包成独立的可执行文件。以下会基于如何在win系统上将python程序打包为exe可执行程序为例&#xff0c;介绍安装方式、快速使用、注意事项以及特别用法。 2.安装方式 通过 pip 安装 PyInstal…

万界星空科技MES系统:食品加工安全的实时监控与智能管理

万界星空科技MES系统通过集成多种技术和功能&#xff0c;能够实时监控食品加工过程中各环节的安全风险。以下是对该系统如何实现实时监控的详细分析&#xff1a; 一、集成传感器和数据分析技术 万界星空科技MES系统利用集成的传感器和数据分析技术&#xff0c;实时监控生产过程…

基于SSM的校园一卡通管理系统的设计与实现

摘 要 本报告全方位、深层次地阐述了校园一卡通管理系统从构思到落地的整个设计与实现历程。此系统凭借前沿的 SSM&#xff08;Spring、Spring MVC、MyBatis&#xff09;框架精心打造而成&#xff0c;旨在为学校构建一个兼具高效性、便利性与智能化的一卡通管理服务平台。 该系…

数学建模入门

目录 文章目录 前言 一、数学建模是什么&#xff1f; 1、官方概念&#xff1a; 2、具体过程 3、适合哪一类人参加&#xff1f; 4、需要有哪些学科基础呢&#xff1f; 二、怎样准备数学建模&#xff08;必备‘硬件’&#xff09; 1.组队 2.资料搜索 3.常用算法总结 4.论文撰写的…

微前端解决方案

在实施微前端架构时&#xff0c;前端框架和技术的选型是非常重要的。不同的框架和技术有着不同的优缺点&#xff0c;需要结合具体的应用场景进行选择。一、常见的微前端解决方案 Web Components Web Components&#xff08;包括Custom Elements、Shadow DOM和HTML Imports&…