【牛客网面试必刷TOP101】链表篇(一)

news2024/12/23 6:15:36

【牛客网面试必刷TOP101】链表篇(一)

  • 前言
  • 刷题网站
  • 刷题!
    • BM1 反转链表
      • 思路一:用栈解决
      • 思路二:双链表求解
      • 思路三:递归解决
      • 总结
    • BM2 链表内指定区间反转
      • 思路一:头插法迭代
      • 思路二:递归
    • BM3 链表中的节点每k个一组翻转
      • 思路:递归
  • 总结

前言

链表是数据结构中重要的一个章节,他的重要性也不言而喻
面试都会遇到这类的题目,以下是链表的常考的题目。

刷题网站

牛客网:https://www.nowcoder.com/activity/oj
在这里插入图片描述

刷题!

BM1 反转链表

https://www.nowcoder.com/share/jump/6243324481684200142743
在这里插入图片描述

思路一:用栈解决

链表的反转是老生常谈的一个问题了,同时也是面试中常考的一道题。最简单的一种方式就是使用栈,因为栈是先进后出的。实现原理就是把链表节点一个个入栈,当全部入栈完之后再一个个出栈,出栈的时候在把出栈的结点串成一个新的链表。原理如下:
在这里插入图片描述
在这里插入图片描述

public class Solution {
        public ListNode ReverseList(ListNode head) {
            Stack<ListNode> stack= new Stack<>();
            //把链表节点全部摘掉放到栈中
            while (head != null) {
                stack.push(head);
                head = head.next;
            }
            if (stack.isEmpty())
                return null;
            ListNode node = stack.pop();
            ListNode dummy = node;
            //栈中的结点全部出栈,然后重新连成一个新的链表
            while (!stack.isEmpty()) {
                ListNode tempNode = stack.pop();
                node.next = tempNode;
                node = node.next;
            }
            //最后一个结点就是反转前的头结点,一定要让他的next
            //等于空,否则会构成环
            node.next = null;
            return dummy;
        }
    }

思路二:双链表求解

双链表求解是把原链表的结点一个个摘掉,每次摘掉的链表都让他成为新的链表的头结点,然后更新新链表。
在这里插入图片描述

public ListNode ReverseList(ListNode head) {
        ListNode newhead=null;
        while(head!=null){
            ListNode tmp=head.next;
            head.next=newhead;
            newhead=head;
            head=tmp;
        }
        return newhead;
    }

思路三:递归解决

public ListNode ReverseList(ListNode head) {
        if(head==null||head.next==null){
            return head;
        }
        ListNode next=head.next;
        ListNode reverse=ReverseList(next);
        next.next=head;
        head.next=null;
        return reverse;
    }

总结

在这里插入图片描述

BM2 链表内指定区间反转

https://www.nowcoder.com/share/jump/6243324481684200129562
在这里插入图片描述

思路一:头插法迭代

思路大体可以分为三个步骤:

1️⃣ 先创建一个前序头指针,为了防止第一个元素也要逆序。
2️⃣用双指针prev和cur找到m的位置,prev就指向m的前一个位置,方便把cur的下一个元素移动到cur的前面
3️⃣对于从m到n这些个位置的节点,依次断掉指向后续的指针,反转指针方向。

public ListNode reverseBetween (ListNode head, int m, int n) {
        ListNode res=new ListNode(-1);
        res.next=head;
        ListNode pre=res;
        ListNode cur=head;
        for(int i=1;i<m;i++){
            pre=cur;
            cur=cur.next;
        }
        for(int i=m;i<n;i++){
            ListNode tmp=cur.next;
            cur.next=tmp.next;
            tmp.next=pre.next;
            pre.next=tmp;
        }
        return res.next;
    }

思路二:递归

我们来看看另一种分析:如果m == 1,就相当于反转链表的前n个元素;如果 m != 1,我们把 head 的索引视为 1,那么我们是想从第 m 个元素开始反转,如果把 head->next 的索引视为1,那相对于 head->next的反转的区间应该是从第 m−1个元素开始的,以此类推,反转区间的起点往后就是一个子问题。
在这里插入图片描述

 ListNode temp = null;
    public ListNode reverse(ListNode head, int n){
        //只颠倒第一个节点,后续不管
        if(n == 1){
            temp = head.next;
            return head;
        }
        //进入子问题
        ListNode node = reverse(head.next, n - 1);
        //反转
        head.next.next = head;
        //每个子问题反转后的尾拼接第n个位置后的节点
        head.next = temp;
        return node;
    }
    public ListNode reverseBetween (ListNode head, int m, int n) {
        //从第一个节点开始
        if(m == 1)
            return reverse(head, n);
        //缩减子问题
        ListNode node = reverseBetween(head.next, m - 1, n - 1);
        //拼接已翻转
        head.next = node;
        return head;
    }

BM3 链表中的节点每k个一组翻转

https://www.nowcoder.com/share/jump/6243324481684200097423
在这里插入图片描述

思路:递归

把每一段分开逆序,每一段的逆序前面已经做过,那么接下来就是把每段逆序后的结果链接到一起。

要注意的是: 例如第一段逆序完后head为尾部,那么链接下一段就是head->next = 子问题。
当进行到最后一个分组,即不足k次遍历到链表尾(0次也算),就将剩余的部分直接返回。

public ListNode reverseKGroup (ListNode head, int k) {
        ListNode tail=head;
        for(int i=0;i<k;i++){
            if(tail==null){
                return head;
            }
            tail=tail.next;
        }
        ListNode pre=null;
        ListNode cur=head;
        while(cur!=tail){
            //翻转
            ListNode temp = cur.next;
            cur.next = pre;
            pre = cur;
            cur = temp;
        }
        head.next=reverseKGroup(tail,k);
        return pre;
    }

总结

链表的题目一定要画图,思路可以从头插法,递归角度思考!

💓 感谢阅读

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

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

相关文章

几乎涵盖微服务所有操作,阿里2023最新SpringCloudAlibaba实战进阶笔记太强了

近两年&#xff0c;“大厂裁员”总是凭实力冲上各大媒体头条&#xff0c;身在局中的我们早已习以为常。国内的京东&#xff0c;阿里&#xff0c;腾讯&#xff0c;字节&#xff0c;快手&#xff0c;小米等互联网公司都以不同程度的裁员比例向社会输送人才。大量有大厂经验的卷王…

常用性能指标、性能指标评估及性能测试通过标准

一、常用性能指标 1、并发用户数&#xff1a; 指同一时间点对系统进行操作的用户数。准确说为"同时向服务器发送服务请求,给服务器产生压力的用户数量" 并发用户数和注册用户数、在线用户数的概念不同&#xff1a; 并发用户数一定会对服务器产生压力的&#xff0…

Mac FortiClient VPN一直连接不上?正确的安装步骤来了!

Mac FortiClient完整版安装 1、下载FortiClient 这里使用FortiClient 7.0.7的版本。登录fortiClient 7.x 网站下载FortiClient_7.0.7.0245_macosx.dmg。 2、当然要是不想注册&#xff0c;也可以点击这里&#xff01; 3、或者安装我这里的固定版本【百度网盘】提取码&#xff…

极狐GitLab as Code,全面升级你的 GitOps 体验

&#x1f4a1; 近日&#xff0c;由微软和英特尔联合发起的第二届开源云原生开发者日&#xff08;Open Source Cloud Native Developer Day&#xff09;上海站顺利落幕。极狐(GitLab) 资深云原生架构师郭旭东在会上进行了《深度探索 GitOps 平台的更多可能》主题演讲&#xff0c…

关于wxapkg路径的一些问题

1 下载安装夜神模拟器。 官网地址&#xff1a;https://www.yeshen.com在模拟器中安装微信&#xff0c;可以下载apk后拖进去&#xff0c;也可在里面下载。不需要RE文件管理器&#xff0c;目前夜神自带Amaze文件管理器&#xff0c;一样的。路径地址为&#xff1a; /data/data/c…

Ubuntu16.04布置CenterFusion记录

安装细节 CenterFusion/src/tools/convert_nuScenes.py内容修改 如果你用的是nuscenes数据集中的Mini部分&#xff0c;那就把convert_nuScenes.py第27行内容中的其他部分注释掉 convert_nuScenes.py在56行处&#xff0c;将数量修改为3 nuscenes-devkit下载 将nuscenes-dev…

计算机网络实验(ensp)-实验1:初识eNSP仿真软件

目录 实验报告&#xff1a; 实验操作 1.建立网络拓扑图并开启设备 2.配置路由器 1.输入命名&#xff1a;sys 从用户视图切换到系统视图 2.输入命名&#xff1a;sysname 姓名 修改路由器名字 3.输入命名&#xff1a;interface g0/0/0 进入端口视图g0…

开源同城跑腿系统(PHP版)

同城跑腿系统的优点在于&#xff0c;它可以为用户提供方便快捷的服务&#xff0c;避免了用户自己跑腿的麻烦和时间成本&#xff0c;同时也为跑腿人员提供了一种灵活的兼职方式 此系统是一款基于likeadmin-php开发的跑腿小程序系统&#xff0c;提供全部前后台无加密源代码&…

知乎高赞回答|只需5分钟,一文教你理解结构化和非结构化数据!

什么是结构化数据&#xff1f; 结构化数据&#xff1a;指关系模型数据&#xff0c;即以关系数据库表形式管理的数据&#xff0c;结合到典型场景中更容易理解&#xff0c;比如企业ERP、OA、HR里的数据。 什么是非结构化数据&#xff1f; 非结构化数据&#xff1a;指数据结构不…

el-tree饿了么elementUI tree树结构插件设置全部展开折叠

效果如上图↑ // 折叠所有节点 foldAllNodes(type) {let treeNodes this.$refs[type _tree].store._getAllNodes()for (var i 0; i < treeNodes.length; i) {treeNodes[i].expanded false;} }, // 展开所有节点 expandAllNodes(type) {let treeNodes this.$refs[type …

Centos7使用for循环语句批量修改文件名

O、前言 虽然单个文件更名&#xff0c;我们可以使用mv命令进行更名。那几百个文件更改&#xff0c;这个工程量比较大&#xff0c;下面介绍一下如何使用for循环语句来批量修改文件名。 一、环境介绍 1.Centos版本:Centos7-X86_64-Eeverything2009 二、命令介绍 这里主要用到ba…

企业电子商务系统 b2b2c o2o 多商家入驻商城 直播带货商城 电子商务

一个好的SpringCloudSpringBoot b2b2c 电子商务平台涉及哪些技术、运营方案&#xff1f;以下是我结合公司的产品做的总结&#xff0c;希望可以帮助到大家&#xff01; 搜索体验小程序&#xff1a;海哇 1. 涉及平台 平台管理、商家端&#xff08;PC端、手机端&#xff09;、买家…

语音常识与基本概念

img { margin: auto; display: block } 数字信号 连续时间信号&#xff1a;在连续时间范围内定义的信号&#xff0c;信号的幅度可以是连续的(模拟信号)&#xff0c;也可以是离散的 离散时间信号&#xff1a;时间为离散变量的信号&#xff0c;即独立变量时间被量化了&#xff0c…

时钟同步-注意客户端和服务端都需要开启123端口 udp协议

确认时钟源 chronyc sources -v chronyc tracking Linux ❉ Chronyd时间同步服务器详解_wangjie722703的博客-CSDN博客 local stratum 10: 即使自己未能通过网络时间服务器同步到时间,也允许将本地时间作为标准时间授时给其它客户端 确认 端口是否打开 Nmap -sU -p 123 192…

创客匠人5月产品升级,功能更新(上)

创客匠人致力为老师们打造更好的知识付费平台&#xff0c;如今&#xff0c;又迎来一波超厉害产品功能升级&#xff0c;有没有你期待的功能上线呢&#xff1f;我们一起来看看吧&#xff01; 正式升级迭代时间&#xff1a;2023年5月18日 一、公众号店铺支持支付宝支付 微信公…

Redis的五大数据类型

一、String数据类型 概述&#xff1a;String是redis最基本的类型&#xff0c;最大能存储512MB的数据&#xff0c;String类型是二进制安全的&#xff0c;即可以存储任何数据、比如数字、图片、序列化对象等 1. SET/GET/APPEND/STRLEN: append命令&#xff1a;append key valu…

log4cplus: 一个好用的日志模块。编译以及使用

log4cplus 日志 介绍 log4cplus 是一个 C 版本的日志库&#xff0c;它是 Apache 组织的 log4j 日志库的一个开源实现。log4cplus 提供了一个灵活的、高性能的日志系统&#xff0c;支持多线程、本地化和分层结构。 log4cplus 的主要特点如下&#xff1a; 灵活性&#xff1a;…

jetson nx 用windows远程连接

VNC Viewer远程连接 一、jetson nx配置vnc 1、安装客户端 sudo apt-get install xrdp vnc4server xbase-clients2、进入nano/nx桌面&#xff0c;打开“Setting–>Desktop sharing”&#xff0c;没反应&#xff0c;据说是bug&#xff0c;我试过nano和nx都一样。首先输入下…

研发效能管理中的经典度量——DORA 指标

有一个组织&#xff0c;每年都会基于对相关从业者的调研和分析&#xff0c;发布一份《DevOps 行业状态报告》&#xff0c;揭秘研发团队的 DevOps 健康状况和平均效能水平&#xff0c;至今已持续了 9 年。目前&#xff0c;全球有超过三万名专业人士参与该调研&#xff0c;而它也…

前端路由+原生JS实现SPA

●前端路由 ●路由: 就是一一对应关系的集合 ●前端路由: 就是一个 url 地址, 对应哪个组件(页面) ●前端路由的本质 ○根据地址栏变化(不重新想服务器发送请求), 去局部更新不同的页面内容, 完成前端业务场景切换 ●前端路由的思路 ○URL 地址栏中的 Hash 值发生了变化 ○前端…