【链表】算法题(二) ----- 力扣/牛客
一、链表的回文结构
思路:
找到链表的中间节点,然后逆置链表的后半部分,再一一遍历链表的前半部分和后半部分,判断是是否为回文结构。
快慢指针找到链表的中间节点
slow指针指向的就是中间节点
逆置链表后半部分
逆置链表后半部分
遍历链表前半部分和后半部分
如果left和right指向的数据不相等,就跳出循环,返回false;如果遍历到left或者right为NULL,数据都相等,那么链表具有回文结构,返回true。
这里如果是奇数个节点:
遍历结束后:
class PalindromeList {
public://找链表中间节点ListNode* Listmid(ListNode* phead){ListNode* fast, *slow;fast=slow=phead;while(fast && fast->next){slow=slow->next;fast=fast->next;}return slow;}//逆置ListNode* reverse(ListNode* phead){ListNode* l1,*l2,*l3;l1=NULL;l2=phead;while(l2){l3=l2->next;l2->next=l1;l1=l2;l2=l3;}return l1;}bool chkPalindrome(ListNode* A) {// write code here//找到链表中间节点ListNode* mid=Listmid(A);//逆置后半部分ListNode* phead = reverse(mid);//比较ListNode* left, *right;left=A;right=phead;while(right && left){if(right->val!=left->val){return false;}left=left->next;right=right->next;}return true;}
};
二、相交链表
判断两个链表是否相交,如果相交就返回相交节点,如果链表不相交,那就返回NULL;
思路:
先遍历两个链表,记录两个链表的节点个数;再同时遍历两个链表 ,让节点个数多的链表先往前走s(链表的节点个数差);同时遍历两个链表,如果指向链表的指针相等,就返回当前节点;如果遍历链表结束后,都没有相等的节点,那就返回NULL。
typedef struct ListNode ListNode;
struct ListNode* getIntersectionNode(struct ListNode* headA,struct ListNode* headB) {if (headA == NULL) {return NULL;}if (headB == NULL) {return NULL;}int sizeA = 0, sizeB = 0;ListNode *l1, *l2;l1 = headA;l2 = headB;while (l1) {sizeA++;l1 = l1->next;}while (l2) {sizeB++;l2 = l2->next;}ListNode* shortList = headA;ListNode* longList = headB;int s = abs(sizeA - sizeB);if (sizeA > sizeB) {shortList = headB;longList = headA;}while (s) {s--;longList = longList->next;}while (longList && shortList) {if (longList == shortList) {return longList;}longList = longList->next;shortList = shortList->next;}return NULL;
}
三、环形链表1
判断 链表中是否存在环,如果存在就返回true,如果不存在就返回false;
思路:快慢指针
定义两个指针fast和slow;遍历链表,fast每次向前走两步,slow每次向前走一步,如果链表存在环,fast与slow指针一定会相遇;如果遍历链表,fast或者fast->next为NULL,则链表不存在环。
根据题目所给示例来分析一下:
首先定义两个指针 fast slow
fast向前走两步,slow向前走一步
fast向前走两步,slow向前走一步
fast向前走两步,slow向前走一步
此时,fast和slow相遇,证明链表中存在环,返回true。
如果链表不存在环结构,遍历过程中fast或者fast->next指针会等于NULL,将这个作为结束条件即可。
typedef struct ListNode ListNode;
bool hasCycle(struct ListNode *head) {ListNode* fast, *slow;fast=slow=head;while(fast && fast->next){fast=fast->next->next;slow=slow->next;if(slow == fast){return true;}}return false;
}
四、环形链表2
上面只是让我们判断链表是否带环,这道题让我们返回链表环的起始节点,如果不存在环就返回NULL。
思路:
使用快慢指针找到快慢指针的相遇节点;再定义两个指针从相遇节点和链表头结点开始遍历,两个指针相遇时的节点就是链表环的起始节点。
根据题目的示例来分析:
先找到链表快慢指针的相遇节点:
定义两个指针从链表头部和相遇节点开始遍历链表
遍历链表直到两个指针相遇
两个指针相遇,此时指针指向的节点就是链表环的起始节点。
typedef struct ListNode ListNode;
ListNode* hasCycle(struct ListNode *head) {ListNode* fast, *slow;fast=slow=head;while(fast && fast->next){fast=fast->next->next;slow=slow->next;if(slow == fast){return slow;}}return NULL;
}
struct ListNode *detectCycle(struct ListNode *head) {//找到快慢指针相遇节点ListNode* pos=hasCycle(head);if(pos==NULL){return NULL;}//从头结点和相遇节点开始遍历ListNode* ptail=head;while(1){if(pos==ptail){return pos;}pos=pos->next;ptail=ptail->next;}
}
五、随机链表的复制
这里题目上提到了一个深拷贝
思路:
先在原链表的基础上创建节点,形成新的链表,再给链表节点的random指针赋值,最后断开新链表和原链表的连接即可。
深拷贝原链表
拷贝过后
给random指针赋值
断开新链表和原链表之前的连接
这样就深拷贝了原链表,返回新链表的头节点即可。
typedef struct Node Node;
// 创建节点
Node* BuyNode(int x) {Node* newnode = (Node*)malloc(sizeof(Node));newnode->next = newnode->random = NULL;newnode->val = x;return newnode;
}
// 深拷贝
void CopyList(Node** head) {Node* ptail = *head;Node* next = NULL;while (ptail) {next = ptail->next;Node* newnode = BuyNode(ptail->val);newnode->next = next;ptail->next = newnode;ptail = next;}
}
void Connect(Node** head) {Node* ptail = *head;Node* copy = (*head)->next;while (ptail) {copy = ptail->next;if (ptail->random)copy->random = ptail->random->next;ptail = copy->next;}
}
struct Node* copyRandomList(struct Node* head) {if (head == NULL){return NULL;} // 深拷贝原链表CopyList(&head);// 连接random指针Connect(&head);// 断开链表Node* ptail = head;Node* newhead = head->next;Node* copy = head->next;while (ptail->next->next) {ptail=copy->next;copy->next = copy->next->next;copy = copy->next;}return newhead;
}
相关文章:
【链表】算法题(二) ----- 力扣/牛客
一、链表的回文结构 思路: 找到链表的中间节点,然后逆置链表的后半部分,再一一遍历链表的前半部分和后半部分,判断是是否为回文结构。 快慢指针找到链表的中间节点 slow指针指向的就是中间节点 逆置链表后半部分 逆置链表后半部分…...
合成复用原则
合成复用原则 (Composite Reuse Principle, CRP) 合成复用原则(Composite Reuse Principle, CRP),也被称为组合/聚合复用原则,是面向对象设计中的一条重要原则。它的核心思想是:优先使用对象组合/聚合,而不…...
安卓自带camera hal3 实例README.md翻译
最近,遇到一个这样的问题,临时了解下这个驱动实现架构和特点,翻译如下 V4L2相机HALv3 camera.v4l2库使用视频Linux 2(V4L2)接口实现了camera HAL v3。这使得它在理论上可以与各种设备配合使用,尽管V4L2的…...
ActiViz实战:ActiViz中的自己实现鼠标双击事件
文章目录 1、添加鼠标事件2、网上实现双击事件的方式3、增加双击的时间限制4、补充说明1、添加鼠标事件 已知在C#中观察者/命令模式会报错,正常添加鼠标事件如下: private void VtkInteractorStyleTest() {vtkInteractorStyle style = vtkInteractorStyle.New();style.LeftB…...
Linux-交换空间(Swap)管理
引入概念 在计算机中,硬盘的容量一般比内存大,内存(4GB 8GB 16GB 32GB 64GB…),硬盘(512GB 1T 2T…)。 冯诺依曼的现代计算机结构体系里面的存储器就是内存 内存是一种易失性存储器,…...
扫描某个网段下存活的IP:fping
前言: 之前用arp统计过某网段下的ip,但是有可能统计不全。网络管理平台又不允许登录。想要知道当前的ip占用情况,可以使用fping fping命令类似于ping,但比ping更强大。与ping需要等待某一主机连接超时或发回反馈信息不同&#x…...
【深度学习】PyTorch框架(3):优化与初始化
1.引言 在本文中,我们将探讨神经网络的优化与初始化技术。随着神经网络深度的增加,我们会遇到多种挑战。最关键的是确保网络中梯度流动的稳定性,否则可能会遭遇梯度消失或梯度爆炸的问题。因此,我们将深入探讨以下两个核心概念&a…...
Go-知识测试-子测试
Go-知识测试-子测试 1. 介绍2. 例子3. 子测试命名规则4. 选择性执行5. 子测试并发6. testing.T.Run7. testing.T.Parallel8. 子测试适用于单元测试9. 子测试适用于性能测试10. 总结10.1 启动子测试 Run10.2 启动并发测试 Parallel 建议先看:https://blog.csdn.net/a…...
.net core IConfiguration 读 appsettings.json 数据,举例
在.NET Core中,IConfiguration 接口是用来读取配置数据的,包括从 appsettings.json 文件中读取。下面是一个如何在使用.NET Core时通过 IConfiguration 读取 appsettings.json 数据的示例。 首先,假设你的 appsettings.json 文件内容如下&am…...
全球Windows机器蓝屏,作为量化人,我的检讨来了
昨天下午,微软给大家放了个假。Windows又双叒死机了。不过,这一次不是几台机器,而是全球大范围宕机。这一刻,大家都是“正蓝旗”。 蓝瓶的,效果好! 现在根本原因已经找到,绝大多数人的机器都已修…...
部署和运维
目录 1.Git1.1. Git指令中merge和rebase的区别1. Commit 记录2. 合并方式3. 冲突处理4. 使用场景选择建议 1.2. cherry-pick的使用如何使用 git cherry-pick例子处理冲突撤销 cherry-pick其他选项 结论 2. 部署1. Nginx的使用场景 编译打包1. webpack2. webpack打包优化1. 代码…...
微信小程序基本语法
官网 https://developers.weixin.qq.com/miniprogram/dev/framework/ 视频教程:尚硅谷微信小程序开发教程,2024最新微信小程序项目实战! 仿慕尚花坊项目源码:https://gitee.com/abcdfdewrw/flower-workshop 目录 一,初…...
测试用例的设计方法
等价类 等价类概念:在所有测试的数据中,具有某种共同特征的数据子集 边界值 边界值分析是对程序输入或输出的边界值进行测试的一种黑盒测试方法 边界值是作为等价类的补充,其主要区别是: 边界值测试设计不是从某一个等价类中…...
Android10.0 锁屏分析-KeyguardPatternView图案锁分析
首先一起看看下面这张图: 通过前面锁屏加载流程可以知道在KeyguardSecurityContainer中使用getSecurityView()根据不同的securityMode inflate出来,并添加到界面上的。 我们知道,Pattern锁所使用的layout是 R.layout.keyguard_pattern_view&a…...
Python 装饰器:函数的函数,代码的艺术
引言 在Python中,装饰器是一种强大的功能,允许程序员在不修改原函数源码的情况下增强或修改函数行为。装饰器本质上是一个接收函数作为参数的高阶函数,并返回一个新的函数或修改原函数的行为。这种机制极大地提高了代码的复用性、可读性和模…...
安全防御2
实验要求: 实验过程: 7,办公区设备可以通过电信链路和移动链路上网(多对多的NAT,并且需要保留一个公网IP不能用来转换): 新建电信区: 新建移动区: 将对应接口划归到各自区域: 新建…...
C语言 ——— 打印水仙花数
目录 何为水仙花数 题目要求 代码实现 何为水仙花数 “水仙花数”是指一个n位数,其各位数字的n次方之和等于该数本身 如:153 1^3 5^3 3^3,则153就是一个“水仙花数” 题目要求 求出0~100000的所有“水仙花数”并输出 代码实现 #i…...
「Conda」在Linux系统中安装Conda环境管理器
在Linux系统中安装Conda环境管理器是一个相对简单的过程。 1. 准备工作 确保你的Linux系统已经更新到最新版本,并安装了基本的开发工具和库。打开终端,执行以下命令: sudo apt-get update sudo apt-get upgrade sudo apt-get install build-essential2. 安装Miniconda或An…...
9.11和9.9哪个大?GPT-4o也翻车了
今天刷到了这个问题,心血来潮去问下chatgpt-4o,没想到疯狂翻车... 第一次问: GPT一开始给出了难绷的解答,让我想起了某短视频软件评论区里对某歌手节目排名的质疑哈哈哈哈哈 但是在接下来的进一步询问和回答中它反应过来了。 第…...
[开源]语雀+Vercel:打造免费个人博客网站
大家好,我是白露。 今天我想和大家分享我的今年的第一个开源项目 —— 基于语雀+Nextjs+Vercel实现免费的博客系统。 简单来说,你在语雀写博客,然后直接一键同步到个人网站上,网站自动部署! 而且,整个过程几乎不需要额外的成本,也不用充值语雀超级会员,hh。这个项目…...
使用ElementUI和element-china-area-data库实现省市区三级联动组件封装
在前端开发中,省市区三级联动是一个常见的需求。今天我们将使用Vue.js和ElementUI组件库,结合element-china-area-data库,来实现一个省市区三级联动的组件。这个组件不仅可以提高用户体验,还能大大简化我们的代码。接下来…...
0718,TCP协议,三次握手,四次挥手
目录 上课喵: TCP(Transmission Control Protocol,传输控制协议)的状态迁移图 TCP连接的状态迁移图 状态迁移说明: 注意: big_htonl.c 字节序转换 addr.c IP地址的转换 作业喵: …...
如何安装Visual Studio Code
Visual Studio Code(简称 VS Code) Visual Studio Code 是一款由微软开发的免费、开源的现代化轻量级代码编辑器。 主要特点包括: 跨平台:支持 Windows、Mac 和 Linux 等主流操作系统,方便开发者在不同平台上保持一…...
vi 编辑器快捷生成 main 函数和基本框架
step1: 执行 sudo vi /etc/vim/vimrc (修改vimrc需要管理员权限:sudo) step2:输入用户密码,回车, 编辑vimrc文件 step3:在尾行输入以下代码(可复制) map mf i#include<stdio.h><ESC>o#includ…...
npm相关指令
切换镜像 腾讯镜像 npm config set registry https://mirrors.cloud.tencent.com/npm/ 淘宝镜像(新版) npm config set registry https://registry.npmmirror.com 淘宝镜像(旧版,已弃用) npm config set regist…...
为什么不要碰自媒体
要是失业了,搞自媒体,可行吗?毫无希望! 如今的自媒体早卷得不成样子了,很难再有机会,根本原因在于几乎没有增量用户的同时,存量用户也不再有剩余时间,全量用户的时间早已被几个自媒…...
酷炫末世意境背景404单页HTML源码
源码介绍 酷炫末世意境背景404单页HTML源码,背景充满着破坏一切的意境,彷佛末世的到来,可以做网站错误页或者丢失页面,将下面的代码放到空白的HTML里面,然后上传到服务器里面,设置好重定向即可 效果预览 …...
PHP 调用 1688 详情 API 接口的实战攻略
在电商领域,获取准确和详细的商品信息对于业务的发展至关重要。1688 作为国内知名的批发采购平台,其详情 API 接口为开发者提供了丰富的数据资源。本文将为您详细介绍如何使用 PHP 调用 1688 详情 API 接口。 一、前期准备 注册 1688 开放平台账号&#…...
SAP ABAP性能优化
1.前言 ABAP作为SAP的专用的开发语言,衡量其性能的指标主要有以下两个方面: 响应时间:对于某项特定的业务请求,系统在收到请求后需要多久返回结果 吞吐量:在给定的时间能,系统能够处理的数据量 2. ABAP语…...
【鸿蒙学习笔记】构建布局・选项卡 (Tabs)
官方文档:选项卡 (Tabs) 目录标题 底部导航顶部导航侧边导航限制导航栏的滑动切换固定导航栏・可滚动导航栏自定义导航栏切换至指定页签 底部导航 Entry Component struct Bujv_tabs {build() {Column() {Tabs({ barPosition: BarPosition.End }) {TabContent() {T…...
怎样做卖活网站/新闻软文推广案例
分布式:一个任务由多个人协作完成。比如饭馆里有负责点菜的,有负责做菜的,有负责传菜的。比如饭馆里有买菜的,洗菜的,切菜的,炒菜的比如饭馆里有好几个负责做菜的 集群:多个人紧密协作ÿ…...
重庆潼南网站建设价格/百度的营销推广模式
带形状的词云前面我们介绍了词云的创建,今天我们介绍带背景的词云。背景图:代码:from wordcloud import WordCloud from matplotlib import pyplot as plt from PIL import Image import numpy as np from wordcloud import WordCloud, STOPW…...
python 做网站 套件/热点事件营销案例
Java应用程序运行时升级软件,无需重新启动的方式有两种,热部署和热加载。 热加载 热加载即在在运行时重新加载class,实现原理主要依赖java的类加载机制,是在运行时通过重新加载改变类信息,直接改变程序行为。在实现方…...
做试管网站/广东省广州市佛山市
XSS:脚本中的不速之客XSS:跨站脚本(Cross-site scripting)CSRF:冒充用户之手CSRF:跨站请求伪造(Cross-site request forgery) 谷歌搜索到几篇好文章。《XSS CSRF 攻击》http://www.c…...
湘潭做网站价格品牌磐石网络/培训报名
函数的基本使用函数的参数详解名称空间与作用域闭包函数装饰器2020.9.11小白学习,如有错误欢迎指点参考自egon大佬Python快速入门神器www.zhihu.com函数使用函数的原因:所有功能的实现代码堆叠在一起,导致代码的组织结构不清晰,…...
微网站独立域名/西安sem竞价托管
1 从file中选择 2...