常见链表面试题总结

《数据结构》十道链表经典面试题多种方法深度解析 《数据结构》十道链表经典面试题多种方法深度解析,配有图解深度挖掘各种细节问题,打好根基,为冲击金丹期做准备。 阅读详情


前言

链表常见面试题

一、回文链表

题目:
在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode() : val(0), next(nullptr) {}
 *     ListNode(int x) : val(x), next(nullptr) {}
 *     ListNode(int x, ListNode *next) : val(x), next(next) {}
 * };
 */
class Solution 
{
public:
    bool isPalindrome(ListNode* head) {
        if(head==nullptr)
        {
            return false;
        }
        if(head->next==nullptr)
        {
            return true;
        }
     ListNode* n1 = head;
     ListNode* n2 = head;
     while(n2->next!=nullptr && n2->next->next!=nullptr)//通过快慢指针找到中间节点
     {
         n1 = n1->next;
         n2 = n2->next->next;
     }
     ListNode* mid = n1;
     n2 = n1->next;
     n1->next = nullptr;//将中间指针next指针置空
     ListNode* n3 = nullptr;
     while(n2!=NULL)//从中间节点的下一个节点开始反转
     {
         n3 = n2->next;
         n2->next = n1;
         n1 = n2;
         n2 = n3;
    }
    n3 = n1;
    n1 = head;
    n2 = n3;
    bool s = true;
    while(n1!=nullptr && n3!=nullptr)//从两边到中间进行比对
    {
        if(n1->val!=n3->val)
        {
            s = false;
            break;
        }
        n1 = n1->next;
        n3 = n3->next;
    }
    n1 = nullptr;
    n3 = n2->next;
    while(n2!=NULL)//将有部分进行反转回来
    {
        n3 = n2->next;
        n2->next = n1;
        n1 = n2;
        n2 = n3;
    }
    return s;
    }
};

二、分隔链表

题目:
在这里插入图片描述

class Solution {
public:
    ListNode* partition(ListNode* head, int x) {
        ListNode* ST = nullptr;//记录小于x第一个节点
        ListNode* SH = nullptr;//记录小于x的最后一个节点
        ListNode* MT = nullptr;//记录大于x的第一个节点
        ListNode* MH = nullptr;//记录大于x的最后一个节点
        ListNode* cur = head;
        while (cur != nullptr)
        {
            ListNode* next = cur->next;//记录下一个节点
            cur->next = NULL;//将其置空
            if (cur->val < x)
            {
                if (SH == NULL)
                {
                    ST = cur;
                    SH = cur;
                }
                else
                {
                    ST->next = cur;
                    ST = cur;
                }

            }
            else
            {
                if (MH == NULL)
                {
                    MT = cur;
                    MH = cur;
                }
                else
                {
                    MT->next = cur;
                    MT = cur;
                }
            }
            cur = next;
        }
        if (SH == NULL)
        {
            return MH;
        }
        ST->next = MH;
        return SH;
    }

};

三、复制带随机指针的链表

题目:

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* next;
    Node* random;
    
    Node(int _val) {
        val = _val;
        next = NULL;
        random = NULL;
    }
};
*/

class Solution {
public:
    Node* copyRandomList(Node* head) {
        if(head==nullptr)
        {
            return nullptr;
        }
        Node* cur = head;
        while(cur!=nullptr)
        {
            Node* next = cur->next;//记录下一个节点
            Node* newnode = new Node(cur->val);//克隆该节点
            cur->next = newnode;//当前节点链接克隆节点
            newnode->next = next;//克隆节点链接原先节点的下一个节点
            cur = next;
        }
    cur = head;
    Node* newhead = head->next;
    while(cur!=nullptr)//
    {
        Node* next = cur->next->next;
        Node* clone = cur->next;//通过原节点的random所连节点的下一个找到克隆节点对应的random
        clone->random = cur->random==nullptr?nullptr:cur->random->next;
        cur = next;
    }
    cur = head;
    while(cur!=nullptr)//将原节点和克隆节点分开
    {
        Node* next = cur->next->next;
        Node* clone = cur->next;
        clone->next = clone->next!=nullptr?clone->next->next:nullptr;
        cur->next = next;
        cur = next;
    }
    return newhead;
    }
};

四、相交链表

题目:

在这里插入图片描述

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    ListNode* getIntersectionNode(ListNode* headA, ListNode* headB) {

        int n1 = 0;//记录A链表的长度
        int n2 = 0;//记录B链表的长度
        ListNode* curA = headA;
        ListNode* curB = headB;
        while (curA != nullptr)
        {
            curA = curA->next;
            n1++;
        }
        while (curB != nullptr)
        {
            curB = curB->next;
            n2++;
        }
        if (curB != curA)//A链表的节点不等于B最后节点的说明必定不相交
        {
            return nullptr;
        }
        ListNode* ML = n1 >= n2 ? headA : headB;//ML指代较长链表
        ListNode* SL = n1 < n2 ? headA : headB;//SL指代较短链表

        int s = fabs(n1 - n2);
        for (int i = 0; i < s; i++)//让较长链表先走s步(长度差)
        {
            ML = ML->next;
        }
        while (ML != SL)
        {
            ML = ML->next;
            SL = SL->next;
        }
        return ML;
    }
};

总结

以上就是面试常见链表题,希望对大家有所帮助!

搞懂单链表常见面试题 搞懂单链表常见面试题 Hello 继上次的 搞懂基本排序算法,这个一星期,我总结了,我所学习和思考的单链表基础知识和常见面试题,这些题有的来自 《剑指 offer》 ,有的来自《程序员代码面试指南》,有的来自 leetCode,不是很全面,但都具有一定代表性,相信大家看完以后一定跟我一样,对面试的时候算法题又多了一份自信。 什么是单链表 链表(Linked list)是一种常... 阅读详情

相关推荐

单向链表常见面试题~真题为例

求单链表中节点的个数 查找单链表中的倒数第k个节点(新浪面试) 单链表的反转(腾讯面试) 从尾到头打印单链表(百度 要求:反向遍历,Stack栈) 合并两个有序的单链表,合并之后的链表依然有序 ...

qq_45058113的博客 1270

链表常见面试题总结

链表常见面试题总结1. 删除链表中等于给定值 **val** 的所有节点。2. 反转一个单链表。3. 给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。4. 输入一个链表,输出该链表中倒数第k个结点。5.将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。6. 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 ,且保证顺序不变。7.在一个排序的链表中,存在重复的结点,请删除

m0_57105290的博客 608

常见的链表面试题大汇总

常见的链表面试题大汇总: 1,创建一个链表结点 2,遍历链表中的所有结点 3,倒序打印链表 4,往链表末尾添加结点 5,往链表前端添加结点, 6,获取链表的节点数目 7,销毁链表 8,求链表中倒数第K个节点 9,反转链表 10,查找链表中间节点 11,判断链表是否有环 12,判断链表是否有环,并返回环上的节点数目

链表面试总结

一. 在链表中穿针引线 2.1 Leetcode 206:Reverse Linked List 反转一个链表。 解法:设立pre,cur和next三个指针完成穿针引线。示意图如下: /** * Definition for singly-linked list. * struct ListNode { * int val; * ListNode *next; ...

wyz6666的博客 585

链表面试题目总结 全

链表是最基本的数据结构,凡是学计算机的必须的掌握的,在面试的时候经常被问到,关于链表的实现,百度一下就知道了。 在此总结一下与链表相关的练习题。题目很全,好好消化。

win10删除vmware12后,重新安装失败(遗留注册表问题)解决总结

之前安装过一次VMware虚拟机,后来由于某些已遗忘原因把它卸载了,但是没有卸载完全,为以后安装留下了一些麻烦,现在根据我google很多内容总结后写下了自己的解决办法。 一些我搜的的可以用的VM12的注册码 5A02H-AU243-TZJ49-GTC7K-3C61N ZZ510-DYX47-48ERP-D6XZG-YCKU2 YV5MU-2FX5H-M841P-LZX5X-PYHX8

Jeason的博客 2万+

链表常见面试题( 建议收藏!!)

链表面试题????1.删除链表中等于给定值 val 的所有节点2.二级目录3.三级目录 1.删除链表中等于给定值 val 的所有节点 题目: 题目链接: https://leetcode-cn.com/problems/remove-linked-list-elements/. 思考: 用tmp记录当前节点,若tmp 的下一个节点不为空且下一个节点的节点值等于给定的 val,则需要删除tmp的下一个节点 2.二级目录 3.三级目录 ...

一朵花花 4625

NVMe与PCIe的完美结合:高速存储背后的技术解析

本文深入解析了NVMe与PCIe技术如何完美结合,实现高速存储性能的飞跃。从机械硬盘到NVMe SSD的进化历程出发,详细介绍了PCIe总线的高带宽优势与NVMe协议的低延迟设计,以及两者协同工作带来的显著性能提升。通过实测数据对比,展示了NVMe SSD在消费级和企业级应用中的卓越表现,并提供了选购与优化建议。

weixin_29216353的博客 376

【方法总结与错误反思】链表面试题

单链表面试题错误原因分析与方法总结

sunflowertyt的博客 592

pytorch中dataloader的num_workers参数

结论速递 在Windows系统中,num_workers参数建议设为0,在Linux系统则不需担心。 1 问题描述 在之前的任务超大图上的节点表征学习中,使用PyG库用于数据加载的DataLoader,ClusterLoader等类时,会涉及到参数num_workers。在不同系统环境试验该参数的设定值时,会出现不同的结果 colab(Linux),设为12 有warning message,提示num_workers参数设置不合理,不影响继续运行 /usr/local/lib/python3.7/di

qq_40990057的博客 1万+

Cortex-M内核DWT周期计数器:从原理到STM32实战时间测量与性能分析

在嵌入式开发中,代码执行耗时测量是性能优化的基础。除了依赖外设定时器或SysTick,ARM Cortex-M3/M4/M7内核自带的DWT(Data Watchpoint and Tracker)调试组件提供了一种极低侵入性的硬件计时方案。其内部的32位周期计数器CYCCNT跟随内核时钟递增,无需占用额外引脚或定时器资源,即可实现纳秒级分辨率的函数耗时测量、中断响应分析及延时实现。从DWT寄存器配置、周期差值计算到基于SystemCoreClock的微秒换算,开发者可以快速搭建一套轻量级性能分析工具。本文

weixin_34216614的博客 187

一文搞定链表常见面试题

链表问题是常见的面试题,字节跳动,阿里云等大型互联网公司都会通过该类型题来判断面试者的算法基础能力,在校招的过程中,我遇到了不少关于链表的问题,因此在此进行总结。

weixin_41318622的博客 485

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

C++链表操作及常见面试题解析

本文介绍了C++中链表的基本操作和常见面试题。首先讲解了链表节点定义和创建、打印、插入、删除、反转等基础操作,并给出了完整代码示例。然后重点解析了链表相关的常见面试题,包括环检测、双指针技巧(寻找中间节点和倒数第k个节点)等。文章通过清晰的代码实现,帮助读者掌握链表的核心操作和解题思路,为面试和实际编程提供实用参考。

bkspiderx的博客 768

STM32入门教程:车牌识别

在本文中,我们介绍了如何使用STM32实现车牌识别功能,并提供了详细的代码案例。通过以上步骤,你可以开始开发自己的车牌识别系统了。希望本文对你有所帮助!

2401_85258012的博客 874

从数据库到数据仓库:数据仓库导论

本文为数据仓库导论,旨在介绍数据仓库的基本理念和应用场景,帮助读者理解数据仓库的重要性及其在企业中的实际应用。

探索大数据世界 - 深入解析数据存储、分布式计算与人工智能 2784

写出一段代码将链表中的两个节点位置互换位置_链表常见操作和15道常见面试题

什么是单链表 链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样将数组存储在一个连续的内存地址空间里,它们可以不是连续的因为他们每个节点保存着下一个节点的引用(地址),所以较之数组来说这是一个优势。对于单链表的一个节点我们经常使用下边这种代码表示:public c...

weixin_39767983的博客 2040

人群仿真软件:Pathfinder_(14).与其他软件的集成与互操作

在人群仿真软件的二次开发中,与其他软件的集成和互操作是非常重要的。通过数据导入导出、接口调用和脚本编写,可以显著提升仿真的准确性和实用性。Pathfinder提供了多种数据格式的支持和丰富的API,使得与其他软件的集成变得简单高效。无论是建筑模型的导入、仿真结果的导出,还是实时数据的交换,Pathfinder都能满足用户的需求。

kkchenjj的博客 1017

单链表的常见面试题1

单链表的常见面试题: 从尾到头打印单链表 删除一个无头单链表的非尾节点(不能遍历链表) 在无头单链表的一个非头节点前插入一个节点(不能遍历链表) 单链表实现约瑟夫环(JosephCircle) 逆置/反转单链表 查找单链表的中间节点,要求只能遍历一次链表 单链表的基础操作 void PrintListTail2Head(pNode head)//倒着打印 { if(head) {

nullcanon的博客 365

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

在单链表写入一组数据代码_链表常见操作和15道常见面试题

什么是单链表链表(Linked list)是一种常见的基础数据结构,是一种线性表,但是并不会按线性的顺序存储数据,而是在每一个节点里存到下一个节点的指针(Pointer),简单来说链表并不像数组那样将数组存储在一个连续的内存地址空间里,它们可以不是连续的因为他们每个节点保存着下一个节点的引用(地址),所以较之数组来说这是一个优势。对于单链表的一个节点我们经常使用下边这种代码表示:public cl...

weixin_39880623的博客 372

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

链表常见面试题

链表面试题 文章目录链表面试题前言一、 删除链表中等于给定值 val 的所有节点。二、反转一个单链表。三、给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点。四、输入一个链表,输出该链表中倒数第k个结点。五、 将两个有序链表合并为一个新的有序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。六、 编写代码,以给定值x为基准将链表分割成两部分,所有小于x的结点排在大于或等于x的结点之前 。七、 链表的回文结构。八、 两个链表相交问题九、 链

艾小方的博客 1227

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

单链表的几个常见面试题

单链表的几个常见面试题。

m0_49342830的博客 175

数据结构|链表常见面试题

以下是链表中常见面试题 单链表实现约瑟夫环 反转单链表 K个节点为一组反转链表 返回链表中间(1/2)节点(扩展返回链表1/K节点) 单链表排序(冒泡排序&快速排序) 查找单链表的中间节点,要求只能遍历一次链表 查找单链表的倒数第K个节点,要求只能遍历一次链表 删除单链表的倒数第K个节点 判断单链表是否有环,如果有环,求环的入口节点 判断两个链表是否相交,若相交,求交点(假设链表不带环) 判断两个链表是否相交,若相交,求交点(假设链表可能带环) 求两个已排序单链表中相同的数据 合并两个有序链表,合

yurensan的博客 370

链表有关的常见面试题

链表有关的常见面试题 1.单链表逆序 实现1: 遍历: 1: /* 2: * 遍历链表, 将每个结点的next置为其前驱 3: * 遍历过程中需要额外的指针来记录结点的前驱和后继 4: */ 5: LinkList ReverseList(LinkList L) 6: { 7: if (!L ||

wxhdmf的专栏 455
上一篇: 归并排序,快速排序,堆排序(小数之和,TOPK问题。。)
下一篇: 二叉树常见面试题
1无名之辈1
博客等级 码龄5年 4674粉丝 46原创
评论 21
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

1无名之辈1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值