链表经典OJ题(链表回文结构,链表带环,链表的深拷贝)
目录
前言
1.反转一个单链表。
2. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
3.链表的回文结构。
4.链表带环问题(*****)
4.1是否带环
4.2 入环的节点
5.随机链表的复制(链表的深拷贝)
前言
前面我们学习了链表,现在我们来手撕几道经典链表OJ题目吧!!!
1.反转一个单链表。
题目链接206. 反转链表 - 力扣(LeetCode)
题解:
在这一题,我们定义了三个指针变量,首先让prev指向NULL,prev的作用是保存cur的前面的一个节点,next是保存cur后面的节点。
每一次循环迭代,都让cur指向前面的节点,也就是指向prev;
再让prev去到cur的位置,cur去到next位置,最后再让next去到cur->next的位置,这样就完成了一次循环迭代。直到cur为NULL;
struct ListNode* reverseList(struct ListNode* head) {struct ListNode*prev = NULL;struct ListNode*cur = head;struct ListNode*next =head;while(cur){next = cur->next;cur->next = prev;prev =cur;cur = next;}return prev; }这样就通过了!
2. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。
题目链接:876. 链表的中间结点 - 力扣(LeetCode)
题解:
这题思想其实非常简单,既然让返回中间节点,那么我们就定义两个指针,fast和slow,让fast走两步,slow走一步,这样fast走完全程之后,slow就只走了一半。
需要注意的是,节点总数为奇数时,fast走到最后一个节点就结束,而节点总数为偶数时,fast节点就要走到NULL。因此结束条件就要写成(fast&&fast->next)。
struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow = head,*fast = head;while(fast&&fast->next){slow = slow->next;fast = fast->next->next;}return slow; }
3.链表的回文结构。
题目链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)
题解:
这一题看似复杂,实际不难。我们只需要找到中间节点,然后从中间节点反转链表 ,再分别从两个头开始遍历,若每个节点都相等,则为回文结构。
如果是奇数个,两条链表节点数量会不会不想等呢?
不会!因为A链表的最后一个并没有与B链表的最后一个节点断开,所以两链表有一个 公共节点,因此在奇数个节点下,两链表节点个数也相同,结束条件显而易见为:(head&&rhead)。
class PalindromeList { public: struct ListNode* reverseList(struct ListNode* head) {//反转链表struct ListNode*prv = NULL;struct ListNode*cur = head;struct ListNode*n =head;while(n){n = cur->next;cur->next = prv;prv =cur;cur = n;}return prv; } struct ListNode* middleNode(struct ListNode* head){//找中间节点struct ListNode* slow = head,*fast = head;while(fast&&fast->next){slow = slow->next;fast = fast->next->next;}return slow; }bool chkPalindrome(ListNode* A) {ListNode* mid = middleNode(A);ListNode*rhead = reverseList(mid);while(A&&rhead){if(A->val!=rhead->val)return false;A=A->next;rhead=rhead->next;}return true;} };
4.链表带环问题(*****)
链表带环问题是链表中非常重要的一类问题,在企业面试中也会经常遇到。此类问题有两种,第一种是判断链表是否带环,第二种是判断链表开始入环的节点是哪个。
4.1是否带环
题目链接:141. 环形链表 - 力扣(LeetCode)
题解:我们不禁思索,该如何判断链表是否带环呢?
在这里我们可以定义两个指针fast和slow,让fast先走,如果到最后还能与slow相遇,那就证明该链表是带环的。在此就引出了一个问题,fast要比slow快多少?
1.slow一次走一步fast一次走两步一定会相遇吗?
答案是一定会相遇,因为fast和slow的距离每次都缩减1,到最后一定会减到0。
2.slow一次走一步fast一次走三步一定会相遇吗?
答案是不一定,如果N为偶数,fast和slow的距离每次都缩减2,最后一定会减到0。如果为奇数,最后会减到-1,这样就又开始新一轮的追击了,而且永远不会相遇。
3.slow一次走n步fast一次走m步一定会相遇吗?(m>n>1)
最后我们得到2L = n*C-N最后一定得到的是一个奇数,所以最后一定能追上。
bool hasCycle(struct ListNode *head) {struct ListNode* fast = head,*slow =head;while(fast&&fast->next){fast =fast->next->next;slow =slow ->next;if(fast ==slow)return fast;}return NULL; }
4.2 入环的节点
题目链接:142. 环形链表 II - 力扣(LeetCode) 、
题解:这一题与上一题是不一样的,这一题是要找到入环的节点,从哪个节点开始入环,这题难度相较于上一题显然是上升了。
假设,fast和slow在meet点相遇,那么slow就走了(L+X)的距离,fast就走了(L+X+n*C)的距离,最后由图上等式可得,L=n*C-X,那也就是说,如果相同速度的指针,一个从相遇点开始走,另一个从入口点开始走,他们到入口与点的距离是一样的,所以一定会在入口点相遇。
因此本题思路就出来了:1.找到相遇点 2.让相同速度的指针,一个从相遇点开始走,另一个从入口点开始走。最终就一定会相遇。
struct ListNode *detectCycle(struct ListNode *head) {struct ListNode *slow = head,*fast =head;while(fast&&fast->next){slow = slow->next;fast= fast->next->next;if(slow == fast){struct ListNode* meet= slow;while(head!=meet){head = head->next;meet =meet->next;}return meet;}}return NULL; }
5.随机链表的复制(链表的深拷贝)
题目链接:138. 随机链表的复制 - 力扣(LeetCode)
题解:链表的深拷贝,是链表中较难的问题,但如果把思路理清,问题也就迎刃而解了。
我们的第一思路可能就是将每个节点的信息先拷贝下来,然后我们来处理random的指向的时候,可能就是用嵌套循环将每个节点的random进行比较,来确定指向,这样一来就造成时间复杂度到达O(N^2)了,这就不符合题目要求了。
那么我这里就提供一种可行的思路:
1.拷贝的节点都插入在原来节点的后面(如图)
2.处理random的指向
我们可以清楚的看到,原节点的下一个节点就是我们所拷贝的节点,那么让本来指向原节点random,指向原节点的下一个是不是就可以让拷贝节点的random完成正确的指向,这就解决了然random指向的问题了。如图(我们已经得到所有的拷贝节点了。)
3.copy的节点一个一个的解下来尾插就可以得到我们想要的深拷贝出来的链表了。
完整代码:
truct 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;elsecopy->random = cur->random->next;cur = cur->next->next; }struct Node* newhead = NULL,*fail=NULL;cur =head;while(cur){struct Node*copy = cur->next;struct Node*next =copy->next;if(newhead==NULL){newhead = fail = copy;}else{fail->next = copy;fail=fail->next;}cur->next = next;cur = next;}return newhead; }
这里都是链表比较经典的题目,希望对你有所帮助!!!
相关文章:
链表经典OJ题(链表回文结构,链表带环,链表的深拷贝)
目录 前言 1.反转一个单链表。 2. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。 3.链表的回文结构。 4.链表带环问题(*****) 4.1是否带环 4.2 入环的节点 5.随机链表的复制(链表的深拷贝) 前言…...
AD教程 (十三)常见CHIP封装的创建
AD教程 (十三)常见CHIP(贴片)封装的创建 PCB封装是电子设计图纸和实物之间的映射体,具有精准数据的要求,在实际设计中需要通过规格书获取创建封装的数据参数。 PCB封装和实物的大小一致。PCB封装是承载实物…...
从0到1实现一个前端监控系统(附源码)
目录 一、从0开始 二、上报数据方法 三、上报时机 四、性能数据收集上报 收集上报FP 收集上报FCP 收集上报LCP 收集上报DOMContentLoaded 收集上报onload数据 收集上报资源加载时间 收集上报接口请求时间 五、错误数据收集上报 收集上报资源加载错误 收集上报js错…...
第7章-使用统计方法进行变量有效性测试-7.2-方差分析
目录 7.2 方差分析 7.2.1 单因素方差分析 组内变异 组间变异 总变异 随机误差...
【MongoDB】索引 – 文本索引(用权重控制搜索结果)
一、准备工作 这里准备一些数据 db.books.drop();db.books.insert({_id: 1, name: "Java", alias: "java 入门", description: "入门图书" }); db.books.insert({_id: 2, name: "C", alias: "c", description: "C 入…...
Git 入门使用
一、Git 入门 1.1 Git简介 Git是一个开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目。Git是由Linus Torvalds为了帮助管理Linux内核开发而开发的一个开放源码的版本控制软件。 Git是目前世界上最先进的分布式版本控制系统,没有之一&a…...
如何写好接口自动化测试脚本
谈到接口测试,大家关注更多的是哪个工具更优秀,更好用。但是很少人关注到接口测试用例的设计问题,也很少人会去写接口用例,都代码化了嘛,还写什么用例,是吧? 这样真的对么?我们是不…...
openEuler编译安装nmon性能监控工具及可视化分析工具
ln 介绍 nmon(short for Nigel’s Monitor)是一个性能分析工具,由蓝色巨人IBM开发,最早用于自家操作系统UNIX,AIX (Advanced Interactive eXecutive)。现在也能用在Linux上。它可以显示系统的…...
96 前缀树Trie
前缀树 题解1 STL题解2 参考官方 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: …...
“第六十六天”
这个我记得是有更优解的,不过还是明天发吧,明天想一想,看看能不能想起来 #include<string.h> int main() {char a[201] { 0 };char b[201] { 0 };scanf("%s %s", a, b);int na strlen(a);int nb strlen(b);int i 0, j …...
MYSQL5.7和MYSQL8配置主从
1、创建专门主从的账号 #登录 mysql -u root -p #创建用户 我这里用户名为test5,注意这里的ip是从库服务器的ip CREATE USER test5192.168.1.20 IDENTIFIED WITH mysql_native_password BY xxxxx; #给主从复制账号授权 grant replication slave on *.* to test5192…...
springboot苍穹外卖实战:九、小程序微信登录代码开发+商品浏览
微信登录 application.yml和application-dev.yml application-dev.yml sky:wechat:appid: xxxsecret: xxxapplication.yml sky:wechat:appid: ${sky.wechat.appid}secret: ${sky.wechat.secret}配置为微信用户生成jwt令牌时使用的配置项: application.yml sky…...
【MySQL系列】 第二章 · SQL(下)
写在前面 Hello大家好, 我是【麟-小白】,一位软件工程专业的学生,喜好计算机知识。希望大家能够一起学习进步呀!本人是一名在读大学生,专业水平有限,如发现错误或不足之处,请多多指正࿰…...
SpringBoot_01
Spring https://spring.io/ SpringBoot可以帮助我们非常快速的构建应用程序、简化开发、提高效率。 SpringBootWeb入门 需求:使用SpringBoot开发一个web应用,浏览器发起请求/hello后,给浏览器返回字符串"Hello World~~~"。 步骤…...
【OS】AUTOSAR架构下多核通信
目录 前言 正文 1.多核通信介绍 2.多核间标准通信 2.1 什么是IOC 2.2 IOC的适用范围...
从Docker Hub获取镜像和创建容器
从Docker Hub获取镜像和创建容器 Docker Hub是一个公共的Docker镜像仓库,您可以从中获取各种镜像来构建容器。本文将演示如何从Docker Hub获取镜像,并用这些镜像创建和运行容器。让我们开始吧! 步骤 1:搜索镜像 首先࿰…...
江西开放大学引领学习新时代:电大搜题助力学子迈向成功
江西开放大学(简称江西电大)一直以来致力于为学子提供灵活便捷的学习服务。近年来,携手电大搜题微信公众号,江西开放大学以其卓越的教学质量和创新的教学手段,为广大学子开启了一扇通向成功的大门。 作为一家知名的远…...
入门指南:Docker的基本命令
入门指南:Docker的基本命令 Docker是一个功能强大的容器化平台,可以帮助您轻松构建、打包和部署应用程序。要充分利用Docker,您需要了解一些基本命令。本文将介绍并示范Docker的一些最重要的基本命令,以帮助您快速上手。 1. doc…...
nvdiffrast的MeshRenderer
获取输入: vertex: 顶点坐标,大小为(B, N, 3)tri: 面片索引,大小为(B, M, 3) 或 (M, 3)feat(可选): 顶点features,大小为(B, C)计算NDC(标准设备坐标)投影矩阵,用于投影到图像平面。将顶点坐标转换到同质坐标(加1维,方便后续运算)。用NDC投影矩阵将顶点坐标转换到NDC空间。创建…...
APISIX源码安装问题解决
官网手册的安装语句: curl https://raw.githubusercontent.com/apache/apisix/master/utils/install-dependencies.sh -sL | bash -执行 install-dependencies.sh 报如下错误: Transaction check error:file /usr/share/gcc-4.8.2/python/libstdcxx/v6…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...
网络编程(UDP编程)
思维导图 UDP基础编程(单播) 1.流程图 服务器:短信的接收方 创建套接字 (socket)-----------------------------------------》有手机指定网络信息-----------------------------------------------》有号码绑定套接字 (bind)--------------…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
深入理解 React 样式方案
React 的样式方案较多,在应用开发初期,开发者需要根据项目业务具体情况选择对应样式方案。React 样式方案主要有: 1. 内联样式 2. module css 3. css in js 4. tailwind css 这些方案中,均有各自的优势和缺点。 1. 方案优劣势 1. 内联样式: 简单直观,适合动态样式和…...
Yii2项目自动向GitLab上报Bug
Yii2 项目自动上报Bug 原理 yii2在程序报错时, 会执行指定action, 通过重写ErrorAction, 实现Bug自动提交至GitLab的issue 步骤 配置SiteController中的actions方法 public function actions(){return [error > [class > app\helpers\web\ErrorAction,],];}重写Error…...
Unity-ECS详解
今天我们来了解Unity最先进的技术——ECS架构(EntityComponentSystem)。 Unity官方下有源码,我们下载源码后来学习。 ECS 与OOP(Object-Oriented Programming)对应,ECS是一种完全不同的编程范式与数据架构…...















