数据结构与算法—链表常见面试题(持续更新)

2023-11-07

参考链接:https://blog.csdn.net/Bruce_0712/article/details/107598682

一、链表环

1.判断链表是否有环

题目

https://leetcode-cn.com/problems/linked-list-cycle
在这里插入图片描述
链表定义

class ListNode{
     int val;
     ListNode next;
     ListNode(int x){
         this.val=x;
         next=null;
     }
 }

方法1:

循环链表将链表节点(注意是节点,不是节点里的值)存入到hashset中,如果元素添加不进去则证明有环

public static boolean hasCycle1(ListNode head){
	//存入的是ListNode类型而不是值
    HashSet<ListNode> hashSet = new HashSet<>();
    while (head!=null){
        if (!hashSet.add(head)){
            return true;
        }
        head=head.next;
    }
    return false;
}

复杂度分析:

  • 时间复杂度:O(N),其中 N 是链表中的节点数。最坏情况下我们需要遍历每个节点一次。
  • 空间复杂度:O(N),其中 N 是链表中的节点数。主要为哈希表的开销,最坏情况下我们需要将每个节点插入到哈希表中一次。

方法2:

题目要求要使用空间复杂度O(1)的方法,可以使用快慢指针解决该问题。

解决思路:定义两个指针,一个指针每次移动一个位置为慢指针,一个指针每次移动两个位置为快指针。当两个指针相遇时就证明有环,如果快指针或者慢指针下一个节点为null,则证明无环。

为什么两个指针一定会相遇呢?
两个指针一旦进入环,遍历的时候相当于无限循环因为出不出来环啊。想象一下时钟,时针分针秒针在不同速度遍历时是不是会相遇呢?

public static boolean hasCycle2(ListNode head){
    if (head==null || head.next==null){
        return false;
    }
    //定义两个指针,快指针比慢指针多一步
    ListNode slow = head;
    ListNode fast = head.next;

    while (slow!=fast){
        if (fast==null||fast.next==null){
            return false;
        }
        //快指针比慢指针多一步
        slow=slow.next;
        fast=fast.next.next;
    }
    return true;
}

复杂度分析

  • 时间复杂度O(N) : 当链表中存在环时,每一轮移动后,快慢指针的距离将减小一。而初始距离为环的长度,因此至多移动 N 轮。
  • 空间复杂度O(1) : 只使用了两个指针额外的空间

更有难度的一道题,检测环中判断入环点是哪个节点:https://leetcode-cn.com/problems/linked-list-cycle-lcci/

二、反转链表

1.完全反转链表

https://leetcode-cn.com/problems/reverse-linked-list/

题目:

给定链表的头结点,然后反转链表,如下

输入:12345null
输出:null12345

链表结构
class LikendNode{
    int val;
    LikendNode next;

    public LikendNode(int val){
        this.val=val;
        this.next=null;
    }
}

方法1

直接反转,这种解法需要知道节点的前一个位置,然后将next指向前一个位置即可。

//null←1←2←3 4->5
//1.断开34的连接;2.将4的next指向前一个节点
public static LikendNode reverseLikenList(LikendNode head){

     //由于单向链表需要存储前一个节点值
     LikendNode prev = null;
     LikendNode curr = head;
     while (curr!=null){
         //将节点4的next值保存下来
         LikendNode next = curr.next;
         //将节点3的引用赋值给节点4的next属性
         curr.next=prev;
         //将节点4的引用复制prev,供节点5反转
         prev=curr;
         //当前节点前进一位
         curr=next;
     }
     //返回头节点值
     return prev;
 }

时间复杂度O(N),空间复杂度O(1)

方法2

使用递归的方式,递归到尾结点,然后将引用(指针反转即可)。如1→2→3→4→5→null,递归到节点5,然后反转4←5,依次出栈就可以。如下动画
请添加图片描述

动画源地址:https://www.bilibili.com/video/BV1p64y1Y7Kv?from=search&seid=3392268296821940588&spm_id_from=333.337.0.0

//1→2→3→4→5→null
public static LikendNode reverseLikendList1(LikendNode head){
    if (head==null || head.next==null){
        return head;
    }
    //递归,当递归到节点5时,因为head.next==null开始返回节点5
    //出栈节点4
    //   1→2→3→4←5
    LikendNode newHead = reverseLikendList1(head.next);
    //将5.next=4,即4←5
    head.next.next=head;
    //然后将4->5的引用断开
    head.next=null;
    return newHead;
}

注意newHead的值,只返回节点5,因为是从return head得到的,之后的出栈没有修改newHead值。如果不太明白的话,用IDEA的DEBUG模式看入栈出栈过程就明白了。

复杂度分析

  • 时间复杂度:O(n),其中 n 是链表的长度。需要对链表的每个节点进行反转操作。
  • 空间复杂度:O(n),其中 n 是链表的长度。空间复杂度主要取决于递归调用的栈空间,最多为 n层。

相对比迭代法需要额外的空间复杂度。

2.反转部分链表

这个是我当时的面试题,

题目:

https://leetcode-cn.com/problems/reverse-linked-list-ii/

在这里插入图片描述
给定左右两个节点的位置(注意不是值,否则还要考虑值重复问题),反转区间的链表

输入:head = [1,2,3,4,5], left = 2, right = 4 输出:[1,4,3,2,5]

输入:head = [5], left = 1, right = 1 输出:[5]

方法1

参考链接:https://leetcode-cn.com/problems/reverse-linked-list-ii/solution/java-shuang-zhi-zhen-tou-cha-fa-by-mu-yi-cheng-zho/

  • 1.定义一个虚拟头结点dummyHead,方便反转链表后返回反转后的头结点
  • 2.定义一个指针 guard 守卫指针,放到反转链表区间前
  • 3.定义一个指针 point,指向反转链表区间第一个位置
  • 4.之后采用头插法,将point所指元素的后一个结点,插入到guard 指针后,直到区间反转完成。

在这里插入图片描述

 public ListNode reverseBetween(ListNode head, int left, int right) {
     //定义一个虚拟头结点
     ListNode dummyNode = new ListNode(0);
     dummyNode.next=head;

     //1.定义两个指针,守卫节点(grade)和指针节点(point)
     //守卫节点控制边界头插法,指针节点删除移动节点
     ListNode g = dummyNode;
     ListNode p = dummyNode.next;

     //2.移动两个节点到指定位置。
     //将g移动到第一个要反转的节点的前面,将p移动到第一个要反转的节点位置上
     for (int step=0;step<left-1;step++){
         g=g.next;p=p.next;
     }

     //3.头插法插入节点
     //将p后面的元素删除,添加到g的后面,就是头插法
     for (int i = 0;i<right-left;i++){
         //删除p后面的元素
         ListNode removed = p.next;
         p.next = p.next.next;

         //将p后面的元素添加到g后面
         removed.next=g.next;
         g.next=removed;
     }
     return dummyNode.next;
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

数据结构与算法—链表常见面试题(持续更新) 的相关文章

  • CCF模拟题 202309-1 坐标变换(其一)

    问题描述 试题编号 202309 1 试题名称 坐标变换 其一 时间限制 1 0s 内存限制 512 0MB 问题描述 对于平面直角坐标系上的坐标 x y 小P定义了一个包含n个操作序列T t1 t2 tn 其中每个操作ti 1 lt i
  • 华为OD机试真题-字符串拼接-2023年OD统一考试(C卷)

    题目描述 给定M 0
  • 华为OD机试真题-计算三叉搜索树的高度-2023年OD统一考试(C卷)

    题目描述 定义构造三叉搜索树规则如下 每个节点都存有一个数 当插入一个新的数时 从根节点向下寻找 直到找到一个合适的空节点插入 查找的规则是 1 如果数小于节点的数减去500 则将数插入节点的左子树 2 如果数大于节点的数加上500 则将数
  • 【质量-弹簧-阻尼系统】基于脉冲响应约束的子空间辨识研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码 数据 文章
  • 2024年华为OD机试真题-小明找位置-Java-OD统一考试(C卷)

    题目描述 小朋友出操 按学号从小到大排成一列 小明来迟了 请你给小明出个主意 让他尽快找到他应该排的位置 算法复杂度要求不高于nLog n 学号为整数类型 队列规模 lt 10000 输入描述 1 第一行 输入已排成队列的小朋友的学号 正整
  • 【路径规划】基于A*算法路径规划研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码实现
  • 2024年华为OD机试真题-手机App防沉迷系统-Java-OD统一考试(C卷)

    题目描述 智能手机方便了我们生活的同时 也侵占了我们不少的时间 手机App防沉迷系统 能够让我们每天合理的规划手机App使用时间 在正确的时间做正确的事 它的大概原理是这样的 1 在一天24小时内 可注册每个App的允许使用时段 2 一个时
  • 链表的中间节点

    链表的中间节点 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 备战技术面试 力扣提供海量技术面试资源 帮助你高效提升编程技能 轻松拿下世界 IT 名企 Dream Offer https leetcode cn problems
  • 基于卡尔曼的混合预编码技术用于多用户毫米波大规模MIMO系统研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 华为OD机试2024年最新题库(Python)

    我是一名软件开发培训机构老师 我的学生已经有上百人通过了华为OD机试 学生们每次考完试 会把题目拿出来一起交流分享 重要 2024年1月 5月 考的都是OD统一考试 C卷 题库已经整理好了 命中率95 以上 这个专栏使用 Python解法
  • 矩阵基本操作

    问题描述 已知一个n n的矩阵 方阵n lt 100 把矩阵主副对角线上的元素值加上x 然后输出这个新矩阵 输入格式 一行两个变量 用空格隔开 代表n和x 接下来的n行每行n列 表示矩阵的数值 用空格隔开 输出格式 输出新矩阵 每个数字5个
  • 矩阵基本操作2

    题目描述 问题描述 将方阵 n 行n列 n lt 100 置成下三角矩阵 主对角线右上角数字全部清零 输入格式 第一行输入n 接下来的n行每行n列 表示矩阵的数值 用空格隔开 输出格式 n行n列下三角矩阵 每个数字3个占位符 左对齐 输入样
  • 毕业设计- 基于深度学习的小样本时间序列预测算法 - Attention

    目录 前言 课题背景与意义 课题实现 一 数据集 二 设计思路 三 相关代码示例 最后 前言 大四是整个大学期间最忙碌的时光 一边要忙着准备考研 考公 考教资或者实习为毕业后面临的就业升学做准备 一边要为毕业设计耗费大量精力 近几年各个学校
  • 顺序表和链表基础

    定义动态的顺序表 typedef int SLDataType typedef struct Seqlist SLDataType array size t size size t capacity Seqlist 在顺序表中插入数据 bo
  • 【牛客周赛Round 27】题目讲解

    题目一 小红的二进制删数字 小红拿到了一个二进制字符串 s 她可以删掉其中的一些字符 使得最终该字符串为一个2的幂 即可以表示为 2 k 形式的数 小红想知道 自己最少删几个字符可以达成 请你编写一个函数返回这个答案 具体思路 看到这道题目
  • 「优选算法刷题」:移动零

    嗨 这个假期罗根开始接触了算法 在为今年的蓝桥杯做准备 所以 开个新专栏 记录记录自己做算法题时的心得 一 题目 给定一个数组 nums 编写一个函数将所有 0 移动到数组的末尾 同时保持非零元素的相对顺序 请注意 必须在不复制数组的情况下
  • 「优选算法刷题」:快乐数

    一 题目 编写一个算法来判断一个数 n 是不是快乐数 快乐数 定义为 对于一个正整数 每一次将该数替换为它每个位置上的数字的平方和 然后重复这个过程直到这个数变为 1 也可能是 无限循环 但始终变不到 1 如果这个过程 结果为 1 那么这个
  • 【固定翼飞机】基于最优控制的固定翼飞机着陆控制器设计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 【GRNN-RBFNN-ILC算法】【轨迹跟踪】基于神经网络的迭代学习控制用于未知SISO非线性系统的轨迹跟踪(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 2 1 第1部分 2 2 第2部分
  • 5_机械臂运动学基础_矩阵

    上次说的向量空间是为矩阵服务的 1 学科回顾 从科技实践中来的数学问题无非分为两类 一类是线性问题 一类是非线性问题 线性问题是研究最久 理论最完善的 而非线性问题则可以在一定基础上转化为线性问题求解 线性变换 数域 F 上线性空间V中的变

随机推荐

  • S​alesforce是怎么完成从0到1的?

    我之前写过无数篇Salesforce的文章 但是很多人还是想看看Salesforce如何从0到1以及从1到10的发展 所以我找来Salesforce的创始人在2009年 Salesforce成立十周年 之际亲自写的一本书 云攻略 来给大家梳
  • Git -将本地项目上传到gitee上

    1 首先你要有一个gitee账号且本地安装有git 2 找到并打开你的项目找到pom xml文件所在目录 右击空白处 点击git bash here git安装成功了一般就会有 3 初始化仓库 初始化完成后在此目录会出现 git 的文件 记
  • java运行一段时间连不上数据库_项目运行一段时候之后就会出现数据库连接被关闭的问题,...

    om jfinal plugin activerecord ActiveRecordException java sql SQLException Invalid state the Connection object is closed
  • Ubuntu小技巧16--常见命令使用方法

    Ubuntu小技巧16 常见命令使用方法 不知觉间Linux系统已用了好多年 各种命令和小工具也接触了若干个 各类笔记分布到各个系统上 可一直没来得及整理归档 最近决定开始慢慢整理linux相关的小工具和命令 把以前 现在和以后的笔记都陆续
  • 云服务器部署和维护,云服务器部署维护

    云服务器部署维护 内容精选 换一换 华为云帮助中心 为用户提供产品简介 价格说明 购买指南 用户指南 API参考 最佳实践 常见问题 视频帮助等技术文档 帮助您快速上手使用华为云服务 服务器上云或云上迁移利用镜像导入功能 将已有的业务服务器
  • 1024程序员节的一些随笔

    转眼间又是一年程序员节 来CSDN已经三年了 之前两年的程序员节都错过 了 所以三年也没混的一个徽章 今年就不要再错过了吧 今年在CSDN是收获满满的一年 自己的文章逐渐被大家所接受 博客也慢慢变的热闹了起来 同时也在CSDN上认识了许多小
  • 排序(三)冒泡排序与快速排序(C语言实现)

    冒泡排序与快速排序都属于交换排序 其中冒泡排序也是十分的出名 实现起来也比较简便 下面一一介绍这两种排序 1 冒泡排序 冒泡排序的意思就是将最大的数沉底 或者最小的数提到最前面来 之后再抛开这个数找次大或此次小的数进行循环 这个过程比较像泡
  • 矩阵分析L2 线性映射与线性变换

    一 线性映射和线性映射 1 定义 线性映射体现在一个向量空间中满足两个合向量的映射等于两个向量映射的和 以及数乘后的映射等于映射后的数乘 线性变换是基于线性映射的一种特例 也就是在自身空间的映射 2 例子 不带乘除的变换 相似变换 微分变换
  • Apache httpd漏洞复现

    文章目录 未知后缀名解析漏洞 多后缀名解析漏洞 启动环境 漏洞复现 换行解析漏洞 启动环境 漏洞复现 未知后缀名解析漏洞 该漏洞与Apache php版本无关 属于用户配置不当造成的解析漏洞 在有多个后缀的情况下 只要一个文件含有 php后
  • osgEarth的Rex引擎原理分析(一零一)TileNode::merge为什么只是不合并最后一个图层

    目标 一零零 中的问题181 因为有些瓦片需要多个图层的数据共同来绘制 如下图 第一层图像数据是不全的 需要第二层的图像数据来填充 绘制时先绘制第二层 再绘制第一层 第一层中没有数据的位置像素点透明 这种情况一般存在于图层边界 osgEar
  • 无效的数值参数“/Wno-cpp”

    问题背景 在windows下执行python setup py build ext inplace 提示命令行 error D8021 无效的数值参数 Wno cpp 仅供参考的解决办法 修改编译参数为如下所示 extra compile
  • 【第三趴】uni-app页面搭建与路由配置(了解工程目录结构、学会搭建页面、配置路由并成功运行)

    文章目录 写在前面 工程结构 新页面呈现 写在最后 本期推荐 写在前面 聚沙成塔 每天进步一点点 大家好我是几何心凉 不难发现越来越多的前端招聘JD中都加入了uni app 这一项 它也已经成为前端开发者不可或缺的一项技能了 所以凉哥为大家
  • 推荐几个不错的前端朋友!

    前端技术日新月异 发展迅速 作为一个与时俱进的前端工程师 需要不断的学习 这里强烈推荐几个前端开发工程师必备的优质公众号 希望对你有所帮助 大家可以像我一样 利用碎片时间阅读这些公众号的文章 Summer 前端充电宝 作者 CUGGZ 掘金
  • Python3,为了“娑娜“,我花费3分钟把lol所有的英雄都下载了。

    协程下载英雄联盟人物皮肤 1 引言 2 代码实战 2 1 网页分析 2 2 代码实战 2 2 1 模块安装 2 2 2 进程 协程 线程区别 2 2 3 代码示例 3 总结 1 引言 小屌丝 鱼哥 快过年 lol不得整起来啊 小鱼 不 我要
  • debug和release的区别

    Debug 和 Release 并没有本质的区别 他们只是VC预定义提供的两组编译选项的集合 编译器只是按照预定的选项行动 如果我们愿意 我们完全可以把Debug和Release的行为完全颠倒过来 当然也可以提供其他的模式 例如自己定义一组
  • MAC下linux双系统的安装

    文章目录 第一步 格式化U盘 第二步 下载系统 这里我选择的是manjaro 第三步 将iso镜像转成dmg格式 第四步 写入镜像 第五步 分空间 第六步 关闭OS X的 SIP保护 第七步 安装refind 第八步 重启按住option键
  • Agisoft Metashape 坐标系选择 坐标转换

    Metashape 坐标系选择 坐标转换 文章目录 Metashape 坐标系选择 坐标转换 前言 一 软件设置 二 坐标系选择 1 有带号坐标系选择 2 无带号坐标系选择 二 坐标转换 以WGS84转CGCS2000投影坐标系为例 1 保
  • 安卓手机刷软路由_华为路由AX3 Pro上手测评:用过最方便的路由器,没有之一...

    都说 科技改变生活 但我总觉着 现如今的人们似乎被数码产品 奴役 了 比如说 之前买过某品牌路由器 设置过程之繁琐 直接让当时是数码小白的我崩溃了 自打那之后 我选购数码产品的标准就改成 方便 这不 最近家里500兆宽带老用户免费升级 5G
  • 真实的程序员的日常

    程序员到底有多累 多辛苦 为什么还有那么多人想转行当程序员 优秀的程序员其实会越来越轻松 计算机世界其实和现实世界很像 解决问题的办法是开放的 而很多时候限制工作量的 其实是想象力 程序员到底有多累 多辛苦 听听前辈们怎么说 IT至今仍是投
  • 数据结构与算法—链表常见面试题(持续更新)

    文章目录 一 链表环 1 判断链表是否有环 题目 方法1 方法2 二 反转链表 1 完全反转链表 题目 方法1 方法2 2 反转部分链表 题目 方法1 参考链接 https blog csdn net Bruce 0712 article