链表经典笔试题(LeetCode刷题)
本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳,希望对你有所帮助。
目录
一、移除链表元素
1.1 问题描述
1.2 思路一
1.2.1 分析
1.2.2 代码
1.3 思路二
1.3.1 分析
1.2.3 思路三
1.3 代码实现
1.3.1 思路1的代码
1.3.2 思路2的代码
二、链表的中间结点
2.1 问题描述
2.2 思路一
2.2.1 分析
2.2.2 代码
2.3 思路二
2.3.1 分析
2.3.2 代码
三、链表中倒数第k个结点
3.1 问题描述
3.2 思路一
3.2.1 分析
3.2.2 思路
3.3 思路二
3.3.1 分析
3.3.2 代码
四、反转链表
4.1 问题描述
4.2 思路一
4.2.1 分析
4.2.2 代码
4.3 思路二
4.3.1 分析
4.3.2 代码
五、合并两个有序链表
5.1 问题描述
5.2 思路一
5.2.1 分析
5.2.2 代码
5.3 思路二
5.3.1 分析
5.3.2 代码
六、链表分割
6.1 问题描述
6.2 思路
6.2.1 分析
6.2.2 代码
七、链表的回文结构
7.1 问题描述
7.2 思路
7.2.1 分析
7.2.2 代码
八、相交链表
8.1 问题描述
8.2 思路
8.2.1 分析
8.2.2 代码
一、移除链表元素
1.1 问题描述
1.2 思路一
1.2.1 分析
双指针的方式,cur中存储的数据如果等于val,就让cur的前一个结点prev的指针指向cur的后一个结点,然后把cur的空间释放了,再继续向后遍历。
在这种情况下我们需要考虑头结点的值就等于val的情况即下例:
1.2.2 代码
struct ListNode* removeElements(struct ListNode* head, int val){struct ListNode* cur = head;struct ListNode* prev = NULL;while(cur){if(head->val==val){head = head->next;free(cur);cur =head;}else {if(cur->val==val){prev->next = cur->next;free(cur);cur = prev->next;}else{prev = cur;cur = cur->next;}}}return head;
}
1.3 代码2
struct ListNode* removeElements(struct ListNode* head, int val){if(head==NULL){return NULL;}struct ListNode* cur = head;struct ListNode* newhead,*tail;newhead = tail = NULL;while(cur){if(cur->val!=val){if(tail==NULL){newhead = tail = cur;}else {tail->next = cur;tail = cur;}cur = cur->next;}else {struct ListNode* next = cur->next;free(cur);cur = next;}}if(tail){tail->next =NULL;}return newhead;}
1.4 代码3
struct ListNode* removeElements(struct ListNode* head, int val){if(head==NULL){return NULL;}struct ListNode* guard,*tail;guard = tail = (struct ListNode*)malloc(sizeof(struct ListNode));guard->next = NULL;struct ListNode* cur = head;while(cur){if(cur->val!=val){tail->next = cur;tail = cur;cur = cur->next;}else {struct ListNode* next = cur->next;free(cur);cur = next;}}tail->next = NULL;struct ListNode* p = guard->next;free(guard);return p;}
二、链表的中间结点
2.1 问题描述
oj链接:876. 链表的中间结点 - 力扣(LeetCode)
2.2 思路一
2.2.1 分析
我们可以使用快慢指针,快慢指针都从head即头结点开始,慢指针slow每次走一步,快指针fast每次走两步,对于此题链表中结点的个数为偶数个和为奇数个时的结束条件不同。
如果链表的结点个数是奇数个,那么当快指针走到最后一个结点时,慢指针正好到达中间结点。
如果链表的结点个数是偶数个,那么就有两个中间结点,题中说明如果有两个中间结点,返回第二个中间结点。当快指针走到最后一个结点的下一个即走到空时,慢指针正好到达中间结点。
2.2.2 代码
struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow = head,*fast = head;while(fast&&fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}
2.3 思路二
2.3.1 分析
通过遍历求出链表结点的总个数,然后得到中间结点的位置,再次遍历找到中间结点,返回。
2.3.2 代码
struct ListNode* middleNode(struct ListNode* head){struct ListNode* cur = head;int count = 0;while(cur){count++;cur = cur->next;}int middle = count/2;cur = head;while(middle--){cur = cur->next;} return cur;
}
三、链表中倒数第k个结点
3.1 问题描述
牛客链接:链表中倒数第k个结点_牛客题霸_牛客网 (nowcoder.com)
3.2 思路一
3.2.1 分析
使用快慢指针,慢指针slow和快指针fast之间距离相差k,然后同步移动,当快指针fast移动到空的时候,慢指针指向的就是倒数第k个结点。
3.2.2 思路
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {struct ListNode* fast = pListHead;struct ListNode* slow = pListHead;while(k--){if(fast!=NULL)fast = fast->next;elsereturn NULL;}while(fast){slow = slow->next;fast = fast->next;}return slow;}
3.3 思路二
3.3.1 分析
求出整个链表的结点个数,倒数第k个结点就是从头结点向后走n-k次。
3.3.2 代码
struct ListNode* FindKthToTail(struct ListNode* pListHead, int k ) {int count = 0;struct ListNode* cur = pListHead;while(cur){count++;cur = cur->next;}if(k>count){return NULL;}int x = count - k;cur = pListHead;while(x--){cur = cur->next;}return cur;}
四、反转链表
4.1 问题描述
oj链接:206. 反转链表 - 力扣(LeetCode)
4.2 思路一
4.2.1 分析
取链表中的结点头插到一个新链表上,然后返回新链表的头结点。
4.2.2 代码
struct ListNode* reverseList(struct ListNode* head){struct ListNode* cur = head;struct ListNode* newhead = NULL;struct ListNode* next = NULL;while(cur){next = cur->next;cur->next = newhead;newhead = cur;cur = next;}return newhead;
}
4.3 思路二
4.3.1 分析
把链表的指针翻转,让每一个指针指向他的前一个。
4.3.2 代码
struct ListNode* reverseList(struct ListNode* head){if(head==NULL)return NULL;struct ListNode* cur = head,*prev = NULL;struct ListNode* next = cur->next;while(cur){next = cur->next;cur->next = prev;prev = cur;cur=next;}return prev;}
五、合并两个有序链表
5.1 问题描述
oj链接:21. 合并两个有序链表 - 力扣(LeetCode)
5.2 思路一
5.2.1 分析
依次比较两个链表的结点,取出小的结点尾插到一个新链表上,当有一个链表走到空时,直接将剩下的那个链表链接到新链表上。
在此方法中我们需要注意:
- 需要单独考虑到两个链表中有空链表的情况。
- 在尾插时,考虑新链表为空的情况,需要单独处理。
5.2.2 代码
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){struct ListNode* n1 = list1,*n2 = list2;struct ListNode* newhead = NULL,*tail = NULL;if(n1==NULL){return n2;}if(n2==NULL){return n1;}while(n1&&n2){if(n1->val<n2->val){if(newhead == NULL){newhead = tail = n1; }else{tail->next = n1;tail = tail->next;}n1 = n1->next;;}else{if(newhead == NULL){newhead = tail = n2; }else{tail->next = n2;tail = tail->next;}n2 = n2->next;;}}if(n1){tail->next = n1;}if(n2){tail->next = n2;}return newhead;}
5.3 思路二
5.3.1 分析
思路二其实是思路一的改进,思路二中引用了带哨兵位的头结点的链表,这样就不需要再单独处理尾插时新链表为空和两个链表中有链表为空的问题,在这里创建哨兵位的头结点主要用动态开辟的方式,当不再使用时需要释放。
5.3.2 代码
struct ListNode* mergeTwoLists(struct ListNode* list1, struct ListNode* list2){struct ListNode* n1 = list1,*n2 = list2;struct ListNode* newhead = (struct ListNode*)malloc(sizeof(struct ListNode));newhead->next = NULL;struct ListNode* tail = newhead;while(n1&&n2){if(n1->val>n2->val){tail->next = n2;n2 = n2->next;tail = tail->next;}else{tail->next = n1;n1 = n1->next;tail=tail->next;}}if(n1){tail->next = n1;}if(n2){tail->next = n2;}struct ListNode* next = newhead->next;free(newhead);return next;}
六、链表分割
6.1 问题描述
oj链接:链表分割_牛客题霸_牛客网 (nowcoder.com)
6.2 思路
6.2.1 分析
新建两个链表,把小于x的尾插到其中一个链表,大于等于x的尾插到另一个链表,然后把这两个链表链接起来。注意我们新建的两个链表最好用带哨兵位的头结点的链表,这样可以避免我们在尾插时需要对空单独分析的问题。
6.2.2 代码
class Partition {
public:ListNode* partition(ListNode* pHead, int x) {// write code herestruct ListNode* lesshead = NULL,*lesstail= NULL;struct ListNode* greaterhead = NULL,*greatertail= NULL;struct ListNode* cur = pHead;lesshead = lesstail = (struct ListNode*)malloc(sizeof(struct ListNode));greaterhead = greatertail= (struct ListNode*)malloc(sizeof(struct ListNode));while(cur){if(cur->val<x){lesstail->next = cur;lesstail=lesstail->next;}else {greatertail->next = cur;greatertail=greatertail->next;}cur = cur->next;}greatertail->next=NULL;lesstail->next = greaterhead->next;free(greaterhead);struct ListNode* p = lesshead->next;free(lesshead);return p;}
};
七、链表的回文结构
7.1 问题描述
oj链接:链表的回文结构_牛客题霸_牛客网 (nowcoder.com)
7.2 思路
7.2.1 分析
在这里我们提供一个思路,首先找到中间结点,然后将中间结点(包括中间结点)后面的部分逆置,然后将前半段和后半段进行比较。
在之前的题目中,我们已经写过了找中间结点以及链表反转的代码,在这里直接拷贝。
7.2.2 代码
struct ListNode* middleNode(struct ListNode* head){struct ListNode* slow = head,*fast = head;while(fast&&fast->next){slow = slow->next;fast = fast->next->next;}return slow;
}struct ListNode* reverseList(struct ListNode* head){if(head==NULL)return NULL;struct ListNode* cur = head,*prev = NULL;struct ListNode* next = cur->next;while(cur){next = cur->next;cur->next = prev;prev = cur;cur=next;}return prev;}class PalindromeList {public:bool chkPalindrome(ListNode* A) {struct ListNode* mid = middleNode(A);struct ListNode* n2 = reverseList(mid);struct ListNode* n1 = A;while(n2&&n1){if(n1->val!=n2->val){return false;}n2 = n2->next;n1 = n1->next;}return true;
}
};
八、相交链表
8.1 问题描述
oj链接:160. 相交链表 - 力扣(LeetCode)
8.2 思路
8.2.1 分析
分别求两个链表的长度,长的链表先走差距步,然后再同时走,第一个地址相同的指针就是交点。
8.2.2 代码
struct ListNode *getIntersectionNode(struct ListNode *headA, struct ListNode *headB) {struct ListNode* n1 = headA;struct ListNode* n2 = headB;int x1 = 0;int x2 = 0;while(n1){x1++;n1 = n1->next;}while(n2){x2++;n2 = n2->next;}if(n1!=n2)return NULL;int x = abs(x1-x2);struct ListNode * shortList = headA,*longList = headB;if(x1>x2){shortList = headB;longList = headA;}while(x--){longList = longList->next;}while(longList!=shortList){longList = longList->next;shortList = shortList->next;}return longList;}
相关文章:
链表经典笔试题(LeetCode刷题)
本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳,希望对你有所帮助。 目录 一、移除链表元素 1.1 问题描述 1.2 思路一 1.2.1 分析 1.2.2 代码 1.3 思路二 1.3.1 分析 1.2.3 思路三 1.3 代码实现 1.3.1 思路1的代码 1.3.2 思路2的…...
SpringCloud五大组件
微服务SpringCloud整合技术组件基本流程: 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心,分为Eure…...
Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】
Echart? ECharts 是一个使用 JavaScript 实现的开源可视化库,涵盖各行业图表,满足各种需求。 ECharts 遵循 Apache-2.0 开源协议,免费商用。 ECharts 兼容当前绝大部分浏览器(IE8/9/10/11,Chrome…...
聊聊腾讯T13技术专家被开除
这两天腾讯的技术大佬stonehuang被曝离开腾讯,据他老婆在小红书上发的帖子称是遭遇了裁员,说实话刚看到这个消息我挺震惊的,stonehuang在中国大前端领域是排得上号的专家,同时他2005年就加入了腾讯,在qq空间的发展历程…...
c++ 常见宏、模板用法【1】
目录1、宏定义实现简单的断言2、可变参数模板3、变量模板4、宏定义实现范围内的for循环5、模板实现函数对象6、宏定义实现作用域限定7、类型萃取模板1、宏定义实现简单的断言 #define ASSERT(expr) \if(!(expr)) { \std::cout << "assertion failed: " <&l…...
【25】Verilog进阶 - 序列检测
VL25 输入序列连续的序列检测 本题并不难【中等】难度给高了 【做题关键】 (1)需要使用移位寄存器的思路。其实reg型是寄存器,也可以当做是移位寄存器,重要的是对其的处理,使用的是移位寄存器的思路 (2)注意新移入数据存放在低位 1 题目 + 代码 + TestBench 很简单,没…...
如何绕开运营商的 QoS 限制
运营商针对 UDP 进行限制,这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一,上了线很多问题,丢包,慢等的问题严重增加运维,运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则,只要换一个端口就可…...
C#基础教程22 异常处理
文章目录 C# 异常处理语法C# 中的异常类异常类 描述异常处理创建用户自定义异常C# 异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理…...
java八股文--java基础
java基础1.什么是面向对象,谈谈对面向对象的理解2.JDK JRE JVM的区别与联系3.和equals4.hashCode与equals5.String StringBuffer StringBuilder的区别6.重载和重写的区别7.接口和抽象类8.List和Set的区别9.ArrayList和LinkedList10.HashMap和HashTable的区别&#x…...
2022年全国职业院校技能大赛(中职组)网络安全竞赛试题A模块第四套解析(详细)
2022年全国职业院校技能大赛(中职组) 网络安全竞赛试题 (4) (总分100分) 赛题说明 一、竞赛项目简介 “网络安全”竞赛共分A.基础设施设置与安全加固;B.网络安全事件响应、数字取证调查和应用安全;C.CTF夺旗-攻击;D.CTF夺旗-防御等四个模块。根据比赛实际情况,竞…...
【Spark】spark使用jdbc连接带有kerberos认证的hive jdbc
背景 这个需求就是spark不通过spark-hive的方式访问hive数据,而是通过spark读取hive jdbc的方式访问hive数据,因为这个hive有kerberos认证,在网上也不是很容易搜索到这样的操作案例。不多bb,直接上教程。 准备工作 准备一个hiv…...
【Maven】项目中pom.xml坐标定义以及pom基本配置
目录 一、pom.xml坐标定义 二、pom 基本配置 一、pom.xml坐标定义 在 pom.xml 中定义坐标,内容包括:groupId、artifactId、version,详细内容如下: <!--项目名称,定义为组织名项目名,类似包名-->&l…...
Linux GCC 编译详解
文章目录一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译一、GCC 编译器简介 首先,什么是编译器呢? 我们可以使用编辑器(如 linux 下的 vi、windows 下…...
谁说程序员不懂了浪费,女神节安排
Python的PyQt框架的使用一、前言二、女神节文案三、浪漫的代码四、官宣文案一、前言 个人主页: ζ小菜鸡大家好,我是ζ小菜鸡,特在这个特殊的日子献上此文,希望小伙伴们能讨自己的女神欢心。 二、女神节文案 1.生活一半是柴米油盐,…...
上市公司管理层短视指标(2007-2020)
1、数据说明:将研发⽀出的减少量(∆R&D)作为管理层短视⾏为的度量指标,即∆R&D为公司t年的研发⽀出减去t-1年的研发⽀出并除以t-1年末的总资产再乘以100。2、数据来源:自主整理3、时间跨度:2007-20…...
IDDPM 和 DDIM 对比
IDDPM 和 DDPM 对比IDDPMDDIMIDDPM IDDPM:Improved Denoising diffusion probabilistic models learning Σθ\Sigma_{\theta}Σθ, 即Σθ(xt,t)exp(vlogβt(1−v)logβ~t)\Sigma_{\theta}\left(x_{t}, t\right)\exp \left(v \log \beta_{t}(1…...
链表OJ题(上)
✅每日一练:876. 链表的中间结点 - 力扣(LeetCode) 解题思路: 定义快慢指针,让快指针走2步,慢指针走1步,当fast或者fast.next为空时,走完链表,此时slow就是中间位置 pub…...
【题解】百度2021校招Web前端工程师笔试卷(第一批):单选题、多选题
题目来源:牛客网公司真题_免费模拟题库_企业面试|笔试真题 (nowcoder.com) 若有错误请指正! 单选题 1 某主机的 IP 地址为 212.212.77.55,子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组,则目的地址可以是&…...
论文解读:SuperPoint: Self-Supervised Interest Point Detection and Description
发表时间: 2018年 项目地址:https://arxiv.org/abs/1712.07629 论文地址:https://github.com/magicleap/SuperPointPretrainedNetwork 本文提出了一种用于训练计算机视觉中大量多视点几何问题的兴趣点检测器和描述符的自监督框架。与patch-based的神经网…...
游戏玩的多,陪玩你了解的多吗?用Python来采集陪玩数据,看看行情和美照
前言 (。・∀・)ノ゙嗨 大家好 现在应该每个人都玩过游戏吧,有些的上瘾,天天玩停不下来,有些的倒是没啥感觉 有游戏就肯定有陪玩啊,毕竟当朋友忙的时候,自己一个…...
React框架创建项目详细流程-项目的基本配置-项目的代码规范
文章目录React创建项目流程与规范项目规范项目配置目录结构样式重置Router配置Redux状态管理axios配置React创建项目流程与规范 项目规范 项目规范: 在项目中都会有一些开发规范和代码风格, 下面介绍一下我采用的规范与风格 文件夹、文件名称统一小写、多个单词以连接符(-)连…...
nnunet入门之一 (CT图像分割)
目录安装环境数据处理预处理训练测试MIC-DKFZ/nnUNet 选择Linux环境运行该项目,Windows环境需要更改较多的参数,暂不支持。 安装环境 安装cuda, cudnn,已安装的检测cuda版本 检测cuda版本: nvcc -v cd /usr/local nvidia-smi&…...
从0到1_批量下载视频
简介:真实从0到1,童叟无欺~ 目标:用python批量下载搜索视频,以“CG 服装”为例 搜索图片就不放啦,不能过审 本章主要介绍如何用python把搜索到的视频直接下载到自己的本地文件夹中~ 介绍一下工作…...
CNCF x Alibaba云原生技术公开课 第十二章 可观测性:监控与日志
1、监控 监控类型 资源监控:cpu、内存、网络等。性能监控:apm监控,一般是通过一些 Hook 的机制在,在虚拟机层、字节码执行层通过隐式调用,或者是在应用层显示注入,获取更深层次的一个监控指标,…...
C语言宏定义几个问题
1.#define Ant A虽说做的是将代码中Ant替换成A,但是是整体的替换,不能将整体分离替换。 不带宏参定义一般形式如下: 格式: #define 标识符 字符串 其中“标识符”为所定义的宏名,“字符串”可以是常数、表达式、格式串…...
王道计算机组成原理课代表 - 考研计算机 第二章 数据的表示和运算 究极精华总结笔记
本篇博客是考研期间学习王道课程 传送门 的笔记,以及一整年里对 计算机组成 知识点的理解的总结。希望对新一届的计算机考研人提供帮助!!! 关于对 数据的表示和运算 章节知识点总结的十分全面,涵括了《计算机组成原理…...
springboot集成mahout实现简单基于协同过滤算法的文章推荐算法
文章目录前言1.建表并且生成一些数据首先,建立一个用户文章操作表(user_article_operation)使用case when语句简单分析数据2. 代码与测试只需要根据表生成相应实体类(注意要加一个value属性来存储分数)主要代码如下&am…...
自动驾驶介绍系列 ———— 看门狗
文章目录硬件看门狗软件看门狗差异分析延申窗口看门狗硬件看门狗 硬件看门狗的本质上是一个定时器电路。通常存在一个输入,输入到MCU的RST端。在正常工作状态下,MCU每隔固定时间间隔会输出一个信号给RST端,实现对看门狗端清零。如果在指定的时…...
今天打开个税APP,我直接人麻了!
点击上方“码农突围”,马上关注这里是码农充电第一站,回复“666”,获取一份专属大礼包真爱,请设置“星标”或点个“在看这是【码农突围】的第 432 篇原创分享作者 l 突围的鱼来源 l 码农突围(ID:smartyuge&…...
javascript进阶学习笔记(含AJAX)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、JS变量(var、let和const)二、for/in循环三、正则表达式语法:正则表达式修饰符:正则表达式模式字符串方法&…...
wordpress好看的页面跳转/站长网
继续上一篇文章,介绍FMCW激光雷达采用的MEMS振镜扫描原理,之所以也需要介绍,因为我们的激光雷达有多种扫描制式,也包括MEMS振镜扫描。MEMS 光学扫描器又称 MEMS 微镜,是激光雷达扫描器的一种。MEMS 指 微机电系统&…...
赣州seo快速霸屏/优化营商环境条例
注意事项:1.此项目没有路由,2.没有 API请求 环境配置 请看文档 tauri 文档 第一步:在需要打包的项目根目录执行命令 npm install --save-dev tauri-apps/cli第二步:在 package.json scripts 中添加 tauri "scripts": …...
厦门营销型网站建设公司/东莞疫情最新消息今天新增病例
在实际的项目开发中会有非常多的对象,怎样高效、方便地管理对象,成为影响程序性能与可维护性的重要环节。Java 提供了集合框架来解决此类问题。线性表、链表、哈希表等是经常使用的数据结构,在进行 Java 开发时,JDK 已经为我们提供…...
wordpress去除版权信息/灰色推广引流联系方式
windows平台下,有什么好的分屏软件推荐?Windows 10 系统为例,系统自带功能支持二分屏/三分屏/四分屏的分屏方式。比如用户通过鼠标将应用窗口拖到屏幕边缘,窗口会自动以占据 1/2 屏幕大小的布局显示,再将另外的窗口拖到另外一半屏幕边缘&…...
公司网站要多少钱/爱站网排行榜
...
合肥网站seo服务/如何优化关键词排名到首页
剑指 Offer 10- II. 青蛙跳台阶问题 题目链接:题目链接 这个题和斐波那契数列是一个问题,用的是斐波那契的递推公司。经典爬楼梯问题 一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答…...