【代码题】五道链表面试题

news2024/10/5 9:28:11

目录

1.移除链表元素

2.反转链表

 3.链表的中间结点

 4.链表中倒数第k个结点

 5.合并两个有序链表


1.移除链表元素

点击进入该题

给你一个链表的头节点 head 和一个整数 val ,请你删除链表中所有满足 Node.val == val 的节点,并返回新的头节点 。

 

 思路:

  1. 既然需要删除val,那么我们要做的一定有找到val值这个操作。
  2. 因为是单链表,无法返回到上一个节点,因此我们需要使用双指针。
  3. 进入while,寻找val,如果找到就将val删除(prev.next=cur.next),删除后,只让cur向后走,因为我们找到的下一个值也可能是val值。如果没有找到,就让prev和cur都向后走一步。
  4. 上方判断跳过了头节点,拿出来单独判断。
  5. 最终返回head。

代码: 

   public ListNode removeElements(ListNode head, int val) {
        //判断链表是否为空
        if(head==null) {
            return null;
        }
        //双指针思想
        ListNode cur=head.next;
        ListNode prev=head;
        
        while(cur!=null) {
            //删除
            if(cur.val==val) {
                prev.next=cur.next;
                cur=cur.next;  
            }else{
                prev=cur;
                cur=cur.next;
            }
            
        }
        //判断第一个是否为key
        if(head.val==val) {
            head=head.next;
        }
        return head;
    }

2.反转链表

点击进入该题

 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

思路:

  1. 先判断特殊情况,无节点和一个节点的情况。
  2. 用cur向后走,用curNext记录cur下一个节点。
  3. 运用头插法将cur一个一个插入到heda前面

 

代码: 

public ListNode reverseList(ListNode head) {
        //无节点情况
        if(head==null){
            return null;
        }
        //一个节点情况
        if(head.next==null) {
            return head;
        }
        ListNode cur=head.next;
        head.next=null;
        //头插法
        while(cur!=null) {
            ListNode curNext=cur.next;
            cur.next=head;
            head=cur;
            cur=curNext;
        }
        return head;
    }

 3.链表的中间结点

 点击进入该题

给定一个头结点为 head 的非空单链表,返回链表的中间结点。

如果有两个中间结点,则返回第二个中间结点。

思路:

  1. 此题运用了,在相同时间和相同路程中,V2是V1的二倍,那么,V2走到最后,V1就刚好走到中间。
  2. 运用双指针、快慢指针思想。
  3. 让prev走两步,让cur走一步,当prev走到尾节点时,cur刚好在中间节点。

 

public ListNode middleNode(ListNode head) {
        // 双指针/快慢指针
        ListNode cur=head;
        ListNode prev=head;
        //prev和prev的后一个都不能为空
        while(prev!=null&&prev.next!=null){
            prev=prev.next.next;
            cur=cur.next;
        }
        return cur;
    }

 4.链表中倒数第k个结点

输入一个链表,输出该链表中倒数第k个结点。 

点击进入该题 

思路:

  1. 倒数第k个结点是链表的长度减k再加1.
  2. 判断特殊情况,head为空,给的k大于链表长度,此时的结果都是null
    public ListNode FindKthToTail(ListNode head,int k) {
        if(head==null) {
            return null;
        }
        int len=0;
        ListNode cur=head;
        while(cur!=null) {
            cur=cur.next;
            len++;
        }
        if(k>len) {
            return null;
        }
        int z=len-k;
        cur=head;
        while(z!=0) {
            cur=cur.next;
            z--;
        }
        return cur;
    }

 5.合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 

点击进入此题

 思路:

  1. 定义一个头结点,比较两个链表结点的值,进行尾插。
  2. 当两个链表任意一个到尾时,停止比较,直接将不为零的链表直接加入到我们合并的链表后面。
public ListNode mergeTwoLists(ListNode list1, ListNode list2) {
        //判断两个链表是否有空?
        if(list1==null) {
            return list2;
        }
        if(list2==null) {
            return list1;
        }
        //确认头结点
        ListNode head=(list1.val>list2.val)?list2:list1;
        //是头结点,需要向后走一步
        if(head==list1){
            list1=list1.next;
        }else{
            list2=list2.next;
        }
        ListNode cur=head;
        //比较大小,开始尾插
        while(list1!=null&&list2!=null) {
            if(list1.val<=list2.val) {
                cur.next=list1;
                list1=list1.next;
                cur=cur.next;
            }else{
                cur.next=list2;
                list2=list2.next;
                cur=cur.next;
            }
        }
        //插入另一个链表剩余的部分
        cur.next=list1==null?list2:list1;
        return head;
    }

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

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

相关文章

CTF-AWD入门手册

引文 AWD赛制是一种网络安全竞赛的赛制。AWD赛制由安全竞赛专家及行业专家凭借十多年实战经验&#xff0c;将真实网络安全防护设备设施加入抽象的网络环境中&#xff0c;模拟政府、企业、院校等单位的典型网络结构和配置&#xff0c;开展的一种人人对抗的竞赛方式&#xff0c;…

语言和文法的形式定义---编译原理

文法的构建问题 * 参考已有的模型 最经典的即是算数表达式的模型&#xff0c;其有多个算术运算符号和优先级别。 文法与正则表达式与有穷自动机的转换 显然是3型文法&#xff0c;也就是正则文法才有相应的性质&#xff0c;因为只有3型文法才是右部至多仅有两个符 号&#xf…

【Vue路由】props配置、replace属性、编程式路由导航、缓存路由组件

文章目录props配置props值为对象props值为布尔值props值为函数总结\<router-link>的replace属性总结编程式路由导航案例实现总结缓存路由组件案例实现总结props配置 我们可以看看我们原来如何使用传递过来的参数的&#xff1a; 我们要写一大长串去从$route身上拿到我们…

传统目标跟踪——光流法

目录 一、光流法 二、LK光流法 2.1 实现原理 2.2 API 三、代码 四、总结 一、光流法 光流&#xff1a;空间运动物体在观察成像平面上像素运动的瞬时速度。 光流法利用图像序列中像素在时间域上的变化以及相邻帧之间的相关性来找到上一帧之间存在的对应关系&#xff0c;…

密码学_RSA

RSA是1977年由罗纳德李维斯特&#xff08;Ron Rivest&#xff09;、阿迪萨莫尔&#xff08;Adi Shamir&#xff09;和伦纳德阿德曼&#xff08;Leonard Adleman&#xff09;一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。 RSA是非…

dom截图的几种实现方式

前端要实现dom截图的功能&#xff0c;现在比较常用的是使用以下两个库 dom-to-image 使用svg技术实现html2canvas 使用canvas技术实现 如果想自己写一个dom截图的可以参考 dom-pointer 代码比较简单&#xff0c;非常适合拿来研究rasterizeHTML.js 目前rasterizeHTML.js已经被…

1231. 航班时间(恶心的输入处理 + 简单的数学)

题目如下&#xff1a; 题解 or 思路&#xff1a; 因为题目假设两次飞行时间是相同的&#xff0c;我们可以通过减法将时差消去。那么飞行时间就是: time1time22\frac{time_1 time2}{2}2time1​time2​ 题目的难点是处理输入&#xff0c;我们可以使用 sscanf 来进行处理&#x…

小程序开发经验分享(1)

账号搭建篇 1. 获取微信小程序的AppID 首先,我们需要拥有一个帐号,如果你能看到该文档,我们应当已经邀请并为你创建好一个帐号。注意不可直接使用服务号或订阅号的AppID。 利用提供的帐号,登录 https://mp.weixin.qq.com ,就可以在网站的“设置”-“开发者设置”中,查…

MySQL高级 SQL优化【插入数据主键优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;插入数据 1.1.1&#xff1a;insert 1). 优化方案一&#xff08;批量插入数据) 2). 优化方案二&#xff08;手动控制事务&#xff09; 3). 优化方案三 &#xff08;主键顺序插入&#xff0c;性能要高于乱序插入。&#xff09; …

java应用集成HanLP进行中文自然语言分词详细完整案例以及demo

本文可以作为上一篇《mysql/mariadb 实现全文检索》的补充&#xff0c;实现对字符串分词的逻辑 什么是自然语言&#xff0c;什么是自然语言分词及例子 什么是自然语言 狭义地讲&#xff0c;利用计算机进行语言分析的研究是一门语言学与计算机科学的交叉学科&#xff0c;学术界…

CTFSHOW新手杯MISC部分WriteUp

引文 之前复现了CTFSHOW新人杯的WEB方向部分题目&#xff0c;今天就复现一下MISC为主的题目&#xff0c;可能有些读者不太明白MISC方向是什么意思&#xff0c;简单来说就是"杂项",包括&#xff1a;隐写&#xff0c;压缩包处理&#xff0c;流量分析&#xff0c;攻击取…

电容基础知识

电解电容负极有标识标有耐压值&#xff08;400V 450WV&#xff09; 容量 &#xff08;68UF&#xff09; 温度&#xff08;105摄氏度&#xff09;等 电容容量判断方法&#xff1a;直标法&#xff1a;上图&#xff0c;容量68微法&#xff0c;耐压值400V。数字表示法&#xff1a;方…

如何在公司审计中保持安全

如何在公司审计中保持安全 如今&#xff0c;财务弹性是决定您的公司能否在不确定时期适应和发展的主要属性之一。这可能令人很惊讶&#xff0c;但您的年度业务审计可以成为您提高业务敏捷性的秘密武器。它通过确定内部控制和财务报告的效果以及哪些流程改进应该在您的优先级列…

蓝桥杯Python练习题15-区间k大数查询

资源限制   内存限制&#xff1a;256.0MB C/C时间限制&#xff1a;1.0s Java时间限制&#xff1a;3.0s Python时间限制&#xff1a;5.0s 问题描述   给定一个序列&#xff0c;每次询问序列中第l个数到第r个数中第K大的数是哪个。 输入格式   第一行包含一个数n&#xf…

黑马Hive+Spark离线数仓工业项目-任务流调度工具AirFlow(2)

Oracle与MySQL调度方法 目标&#xff1a;了解Oracle与MySQL的调度方法 实施 Oracle调度&#xff1a;参考《oracle任务调度详细操作文档.md》 - step1&#xff1a;本地安装Oracle客户端 - step2&#xff1a;安装AirFlow集成Oracle库 - step3&#xff1a;创建Oracle连接 - ste…

ODT在手,DDR5布线可以任性走?

作者&#xff1a;一博科技高速先生成员 姜杰 ODT是On Die Termination的缩写&#xff0c;又叫片内端接&#xff0c;顾名思义&#xff0c;就是把端接电阻放在了芯片内部。作为一种端接&#xff0c;ODT可以减小反射&#xff0c;对信号质量的改善显而易见&#xff0c;SI攻城狮很…

家用宽带搭建个人服务器(二)

本文主要详记免费二级域名注册和免费DDNS解析 写在前头 近几年国内注册域名需要备案&#xff0c;域名解析服务商都陆续需要收费了&#xff0c;对于我这种想简单玩玩的人来说实在是太麻烦了(主要是费钱&#xff09;&#xff0c;花了点时间找到了免费域名注册和DDNS解析 本文基于…

Android绘制原理【通透版】

概述 Android 的显示过程可以简单概括为&#xff1a;Android 应用程序把经过测量、布局、绘制后的surface 缓存数据&#xff0c;通过 SurfaceFlinger 把数据渲染到显示屏幕上&#xff0c;通过 Android 的刷新机制 来刷新数据。也就是说应用层负责绘制&#xff0c;系统层负责渲…

豪掷千亿的卡塔尔,为什么建造可回收的足球场?

作者&#xff1a;木环 来自世界六大洲的八强&#xff0c;正为大力神杯做最后的角逐。在精彩的比赛之外&#xff0c;这届世界杯还留下了很多破圈元素&#xff1a;卡塔尔的两千亿、逗笑的饺子皮表情包、推迟到冬季举办的赛事、围困啤酒赞助商的禁酒令。 以及&#xff0c;一个标…

Jackson 自定义序列化器的使用

注意&#xff1a;从简单的例子去延伸使用&#xff0c;内容紧凑&#xff0c;排版就这样了哈 举例&#xff1a;自定义序列化器&#xff0c;让输出json的指定字段金额10 public class testMain {public static void main(String[] args) throws JsonProcessingException {Bill b…