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 是一种高效、灵活且功能强大的编程语言,广泛应用于系统软件、游戏开发、嵌入式系统、科学计算等多个领域。作为 C 语言的扩展,C 不仅继承了 C 语言的过程化编程特性,还增加了面向对象编程(OOP)的支持ÿ…...

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

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

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小元素
. - 力扣(LeetCode) 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解法 利用快慢指针: /*** 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 来简直就是手到擒来,比 MySQL 简单多了,不需要那么多配置,实际代码就这么多,直接复制就能用。除了提供简单实用的实例以外,本文后面还会简单介绍一下 Redis 的安装与使用,初学者也能一看…...

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

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

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

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

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

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

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

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

FLinkCDC引起的生产事故(二)
背景: 最近在做实时数据的抽取工作,利用FLinkCDC实时抽取目标库Oracle的数据到Doris中,但是在抽取的过程中,会导致目标库的生产库数据库非常卡顿,为了避免对生产环境的数据库造成影响,对生产环境的数据库利…...

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

每日一练:奇怪的TTL字段(python实现图片操作实战)
打开图片,只有四种数字:127,191,63,255 最大数字为255,想到进制转换 将其均转换为二进制: 发现只有前2位不一样 想着把每个数的前俩位提取出来,组成新的二进制,然后每…...

【Java开发实训】day03——方法的注意事项
目录 一、方法的基本概念 二、void和return关键字 三、单一返回点原则 四、static方法使用说明 🌈嗨!我是Filotimo__🌈。很高兴与大家相识,希望我的博客能对你有所帮助。 💡本文由Filotimo__✍️原创,首发于…...

HarmonyOS NEXT:一次开发,多端部署
寄语 这几年特别火的uni-app实现了“一次开发,多端使用”,它这个端指的是ios、安卓、各种小程序这些,而HarmonyOS NEXT也提出了“一次开发,多端部署”,而它这个端指的是终端设备,也就是我们的手机、平板、电…...

Bilibili Android一二面凉经(2024)
BiliBili Android一二面凉经(2024) 笔者作为一名双非二本毕业7年老Android, 最近面试了不少公司, 目前已告一段落, 整理一下各家的面试问题, 打算陆续发布出来, 供有缘人参考。今天给大家带来的是《BiliBili Android一二面凉经(2024)》。 面试职位: 高级Android开发工程师&…...

数据库内核研发学习之路(一)
已经上了几天班了,开始做一些总结性的工作。 数据库内核研发首当其中的便是环境配置,今天先介绍一下虚拟机之类的环境搭建,在之前已经写过一篇关于VMware搭建虚拟机的博客了,有兴趣可以去看看,这里我再总结一下使用Vi…...

LSTM:深度学习中的时间序列处理大师
LSTM:深度学习中的时间序列处理大师 引言 在深度学习领域,处理时间序列数据是一项极具挑战性的任务。时间序列数据广泛存在于金融、医疗、气象、自然语言处理等多个领域,这些数据不仅具有时间依赖性,还常常伴随着复杂的长期依赖…...

T113-i系统启动速度优化方案
背景: 硬件:T113-i + emmc 软件:uboot2018 + linux5.4 + QT应用 分支:longan 问题: 全志T113-i的官方系统软件编译出的固件,开机启动时间10多秒,启动时间太长,远远超过行业内linux系统的开机速度,需要进一步优化。 T113-i 优化后启动速度实测数据 启动阶段启动时间(…...

ArcGis将同一图层的多个面要素合并为一个面要素
这里写自定义目录标题 1.加载面要素的shp数据 2.点击菜单栏的地理处理–融合,如下所示: 3.将shp面要素输入,并设置输出,点击确定即可合并。合并后的属性表就只有一个数据了。...

微软Win11 24H2七月更新补丁KB5040435发布!附下载
系统之家于7月10日发出最新报道,微软为Win11用户发布了24H2版本七月的最新更新补丁KB5040435。用户升级系统后,会发现版本号升至 26100.1150。此次更新针对远程身份验证拨入用户服务(RADIUS)协议与 MD5冲突等问题进行修复。接下来跟随小编看看此次更新的…...

iOS 开发中不常见的专业术语
乐此不疲地把简单的问题复杂化,并把这种XX行为叫作专业 APM 在 iOS 开发中,APM 代表 Application Performance Management(应用性能管理)。APM 是一套监控和管理应用程序性能的工具和技术,旨在确保应用程序运行平稳、…...

【中项第三版】系统集成项目管理工程师 | 第 4 章 信息系统架构④ | 4.7
前言 第4章对应的内容选择题和案例分析都会进行考查,这一章节属于技术相关的内容,学习要以教材为准。本章分值预计在4-5分。 目录 4.7 安全架构 4.7.1 安全威胁 4.7.2 定义与范围 4.7.3 整体架构设计 4.7.4 网络安全架构设计 4.7.5 数据库系统安…...

Time to say GoodBye
北湖的繁华 北湖的繁华 北湖的繁华 终究 终究 终究 还是不属于我了 还是不属于我了 还是不属于我了 永远铭记 6 月 26 日 永远铭记6月26日 永远铭记6月26日 在这天下午 , 一个眼镜男夺走了我的资格 在这天下午,一个眼镜男夺走了我的资格 在这天下午,一个眼镜男夺走了我的资格 永…...