【代码题】链表面试题

news2024/11/13 21:23:56

目录

1.链表分割

 2.相交链表

3.环形链表

 4.环形链表 II


1.链表分割

点击进入该题 

现有一链表的头指针 ListNode* pHead,给一定值x,编写一段代码将所有小于x的结点排在其余结点之前,且不能改变原来的数据顺序,返回重新排列后的链表的头指针。 

思路:

  1. 先读题,题中给一个x值,我们需要将链表通过给的值,左右分别放入小于x的数,和大于x的数。
  2. 可以这样操作,new两个链表,一个链表放入小于x的数,一个链表放入大于x的数,最后将两个链表进行链接。
  3. 链接细节:若 左表为nul,那么我们直接返回右边的头;若左边不为空,我们只需将右表的头,通过尾插法插入到左表的尾。在此之前,我们还需要判断右边的尾节点的nxet是否为空,不为空,我们需要手动制空。不然和出来的链表会带环。
import java.util.*;

public class Partition {
    public ListNode partition(ListNode pHead, int x) {
        // write code here
        ListNode cur=pHead;
        //左边
        ListNode leftHead=null;
        ListNode left=null;
        //右边
        ListNode rightHead=null;
        ListNode right=null;
        //判断存左还是存右
        while(cur!=null) {
            if(cur.val<x) {
                if(left==null) {
                    left=cur;
                    leftHead=cur;
                }else {
                    left.next=cur;
                    left=left.next;
                }
            }else {
                if(right==null) {
                    right=cur;
                    rightHead=cur;
                }else {
                    right.next=cur;
                    right=right.next;
                }
            }
            cur=cur.next;
        }
        //判断左是否为空
        if(leftHead==null) {
            return rightHead;
        }
        //连接两个链表
        left.next=rightHead;
        //判断右边尾结点next是否为空(若不是空,又没进行手动改空,链表会有环)
        if(right!=null) {
            right.next=null;
        }
        return leftHead;
    }
}

 2.相交链表

点击进入该题 

 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。

图示两个链表在节点 c1 开始相交

 思路:

  1. 判断两个链表是否有空链表,如果有一个是空,就不会有交点。
  2. 计算两个链表的长度,让长度长的链表走完他两个的差值。

    3.再让curA和curB一起走,直到两个相等。

/**
 * Definition for singly-linked list.
 * public class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode getIntersectionNode(ListNode headA, ListNode headB) {
        //两个链表任意一个为空,都不会有交点
        if(headA==null || headB==null) {
            return null;
        } 
       //计算两个链表的长度
        int lenA=0;
        int lenB=0;
        ListNode curA=headA;
        ListNode curB=headB;
        while(curA!=null) {
            lenA++;
            curA=curA.next;
        }
        while(curB!=null) {
            lenB++;
            curB=curB.next;
        }
        curA=headA;
        curB=headB;
        int diff=0;
        //谁长让谁把长出来的先走完
        if(lenA>lenB) {
            diff=lenA-lenB;
            while(diff!=0) {
                diff--;
                curA=curA.next;
            }
        }else {
            diff=lenB-lenA;
            while(diff!=0) {
                diff--;
                curB=curB.next;
            }
        }
        //走完,让他们两个一起走,当两个节点地址相同时,就相遇了
        while(curA!=null) {
            if(curA==curB) {
                return curA;
            }
            curA=curA.next;
            curB=curB.next;
        }
        return null;
    }
}

3.环形链表

点击进入该题 

给你一个链表的头节点 head ,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true 。 否则,返回 false 。

思路:

  1. 双指针思想
  2. 一个快指针,一个慢指针。慢指针走一步,快指针走两步,如若有环,快指针总能最上慢指针。

拓展:

为什么不能让快指针走三步?

答:如果走三步的话,可能套圈,也就是无法相遇。他不像我们再生活中跑步,我们相遇总是能看见,他们是无法看到对方的。

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public boolean hasCycle(ListNode head) {
        if(head==null||head.next==null) {
            return false;
        }
        //快慢指针
        //快指针走两步
        //慢指针走一步
        ListNode fast=head.next;
        ListNode slow=head;
        while(slow!=null&&fast!=null&&fast.next!=null) {
            if(slow==fast) {
                return true;
            }
            slow=slow.next;
            fast=fast.next.next;
        }
        return false;
    }
}

 4.环形链表 II

 点击进入该题

给定一个链表的头节点  head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表。

 思路:

        1.先找到相遇点。

        2.找到相遇点,将fast返回到head。

        3.再一步一步走,下次相遇就是入口点。

 

/**
 * Definition for singly-linked list.
 * class ListNode {
 *     int val;
 *     ListNode next;
 *     ListNode(int x) {
 *         val = x;
 *         next = null;
 *     }
 * }
 */
public class Solution {
    public ListNode detectCycle(ListNode head) {      
        ListNode fast=head;
        ListNode slow=head;
        while(fast!=null && fast.next!=null) {
            slow=slow.next;
            fast=fast.next.next;
            if(slow==fast) {
                break;
            }
        }
        if(fast==null||fast.next==null) {
            return null;
        }
        slow=head;
        while(slow!=fast) {
            slow=slow.next;
            fast=fast.next;
        }
        return fast;
    }
}

 

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

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

相关文章

国内注册Steam账号的快捷方法

本文介绍在国内注册Steam账号的快速、简便方法。 目前&#xff0c;在国内注册新的Steam账号变得越来越麻烦&#xff1b;尤其在最近&#xff0c;无论是无休止的谷歌人机身份验证&#xff0c;还是无法收到的验证邮件&#xff0c;都使得新建一个Steam账号与原来相比变得更加困难。…

[Linux_]make/Makefile

[Linux_]make/Makefile 心有所向&#xff0c;日复一日&#xff0c;必有精进专栏&#xff1a;《Linux_》作者&#xff1a;沂沐沐目录 [Linux]make/Makefile 前言 一、Mikefile 二、如何写Mikefile文件 三、原理 四、项目清理 报错&#xff1a;missing separator 前言 一个工…

Linux 命令

最基础的命令 1.我是谁 我用什么账号登录 whoami 2.我在那 在那个目录下 pwd 3.环顾四周 1.ll展示详细信息 2.ls 展示文件名称 4.cd 想去那 改变目录 cd 回家 cd ./ 定位到当前目录 cd../ 上级目录 cd../../上两级目录。 5.切换用户 su 从普通用户切换到root用户的…

C#应用程序配置文件(XML序列化) - 开源研究系列文章

上次写了一个C#线程池及管理器的博文( C#开发的线程池和管理器 - 开源研究系列文章 )&#xff0c;收到了不小的浏览量&#xff0c;在此感谢各位网友的支持。这次将另一个功能放出来单独讲解&#xff1a;C#应用程序的配置文件&#xff0c;使用的是XML文件保存程序的配置信息&…

数据结构(栈、队列、链表)

文章目录前言数据结构(栈、队列、链表)1、栈2、队列3、链表3.1、单向链表结构3.2、双向链表结构前言 如果您觉得有用的话&#xff0c;记得给博主点个赞&#xff0c;评论&#xff0c;收藏一键三连啊&#xff0c;写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不会太差&…

多边形点集排序

一、问题描述已知多边形点集P {P1, P2, ... , PN}&#xff0c;其排列顺序是杂乱&#xff0c;依次连接这N个点&#xff0c;无法形成确定的多边形&#xff0c;需要对点集P进行排序后&#xff0c;再绘制多边形。二、排序规则点集排序过程中&#xff0c;关键在于如何定义点的大小关…

STC32G 时钟系统

文章目录时钟系统代码配置总结时钟系统 系统时钟有4个时钟源可供选择&#xff1a; 内部高精度IRC内部32KHzIRC&#xff08;精度较低&#xff09;外部晶振内部PLL输出时钟 主要关心的是两个指标&#xff1a;SYSclk和HSCLK SYSclk是系统的时钟&#xff0c;决定了指令执行速度…

Android 深入系统完全讲解(三)

系统调用 操作系统提供了一些方法&#xff0c;让用户层可以调用&#xff0c;而为了安全起见&#xff0c;这些方法调用&#xff0c;都是在内核空间。于是&#xff0c;用户调用的时候&#xff0c;就会有个动作&#xff0c;叫做陷入内核。 当用户调用系统方法的时候&#xff0c;系…

【k8s-device plugin】如何编写 k8s device plugin

参考 Device Plugin 入门笔记&#xff08;一&#xff09; Device Plugin 入门笔记&#xff08;二&#xff09; 从零开始入门 K8s&#xff1a;GPU 管理和 Device Plugin 工作机制 Kubernetes开发知识–device-plugin的实现 https://github.com/oceanweave/cola-device-plugi…

基于springboot的智慧物业管理系统的设计与实现(前后端分离)

项目描述 临近学期结束&#xff0c;还是毕业设计&#xff0c;你还在做java程序网络编程&#xff0c;期末作业&#xff0c;老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下&#xff0c;你想解决的问…

mysql 中间件 mycat2 的详细安装及配置步骤

下载 首先打开mycat官网&#xff1a;MyCat2 右上角下载里面有个文件下载服务&#xff0c;点进去发现无法访问 这里需要配置一下host&#xff0c;把下面内容复制到host文件中。host文件位置在C:\Windows\System32\drivers\etc 210.51.26.184 mycat.org.cn www.mycat.org.cn …

第五篇 - 数组的劫持

一&#xff0c;前言 上篇&#xff0c;主要介绍了 Vue 数据初始化流程中&#xff0c;对象属性的深层劫持是如何实现的 核心思路就是递归&#xff0c;主要流程如下&#xff1b; 1.通过 data isFunction(data) ? data.call(vm) : data;处理后的 data 一定是对象类型 2.通过 d…

如何定位Bug——Qt

1. 前言 在写程序的过程中&#xff0c;不可避免出现各种Bug&#xff0c;如何快速的定位到Bug的位置&#xff0c;是程序员必备的技能之一。 2. 几种方法 2.1. 逻辑分析 根据程序所出的问题&#xff0c;分析问题可能所在的几个位置&#xff0c;通过逻辑分析找出Bug&…

从 Nginx Ingress 窥探云原生网关选型

作者&#xff1a; 魁予 现今有越来越多的企业开始采纳云原生理念进行应用架构转型。而 K8s 和微服务是云原生的两大支柱&#xff0c;随着云原生浪潮而被广泛应用。 对多数应用而言&#xff0c;提供对外服务的使命并不会改变&#xff0c;相比于原来的单体应用&#xff0c;微服…

VUE3中,使用.env.development和.env.production

在实际项目开发过程中&#xff0c;可能开发环境和生产&#xff08;测试&#xff09;环境不一样&#xff0c;经常需要修改配置常量&#xff0c;才能满足对应的环境&#xff0c;才能使软件运行起来。在vue3中可以使用2个文件进行区分。 .env.development&#xff1a;开发环境 .…

Mysql存储引擎 初级(自用笔记)

内容来自于(https://www.bilibili.com/video/BV1Kr4y1i7ru?p58&vd_source3cf72bb393b8cc11b96c6d4bfbcbd890) 1.存储引擎 1.1Mysql体系结构 1.2什么是存储引擎呢? 存储引擎就是存储数据,建立索引,更新,查询数据等技术的实现方式. 存储引擎是基于表的,而不是基于数据库的…

魔兽世界开服教程wow服务器框架Trinirycore构建

首先明杰先给各位普及一下TrinityCore是什么TrinityCore 是c实现MMORPG框架来自MaNGOS&#xff0c;大型网络对象服务&#xff0c;随着时间的推移&#xff0c;该项目代码广泛的优化&#xff0c;改善和清理代码。需要准备的架设工具&#xff1a;端&#xff08;版本&#xff09;、…

皮尔逊相关性分析一文详解+python实例代码

目录 前言 一、数值类型 二、皮尔逊系数使用场景 二、皮尔逊相关系数(Pearson correlation) 1.定义 2.线性关系判定 3.正态检验 1.KS检验 4.计算代码 点关注&#xff0c;防走丢&#xff0c;如有纰漏之处&#xff0c;请留言指教&#xff0c;非常感谢 参阅 前言 相关性…

MySQL中这10个小玩意,让人眼前一亮

我最近几年用MYSQL数据库挺多的&#xff0c;发现了一些非常有用的小玩意&#xff0c;今天拿出来分享到大家&#xff0c;希望对你会有所帮助。 1.group_concat 在我们平常的工作中&#xff0c;使用group by进行分组的场景&#xff0c;是非常多的。 比如想统计出用户表中&…

给Kylin iso中添加自定义rpm包

前言 在日常产品交付中会有如下需求&#xff1a; 客户自己安装centos / ubuntu / kylin iso&#xff0c;然后我们把rpm包给到客户 我们直接将rpm包封装到iso&#xff0c;给客户交付整体iso&#xff0c;这样不管是对于客户还是对于公司都是最省心的&#xff0c;会避免很多因为系…