当前位置: 首页 > news >正文

链表经典笔试题(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 问题描述

删除链表中等于给定值 val 的所有结点。
原题链接:https://leetcode.cn/problems/remove-linked-list-elements/description/

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 分析

     依次比较两个链表的结点,取出小的结点尾插到一个新链表上,当有一个链表走到空时,直接将剩下的那个链表链接到新链表上。

在此方法中我们需要注意:

  1. 需要单独考虑到两个链表中有空链表的情况。
  2. 在尾插时,考虑新链表为空的情况,需要单独处理。

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刷题)

本篇文章主要是对力扣和牛客网上一些经典的和链表有关的笔试题的总结归纳&#xff0c;希望对你有所帮助。 目录 一、移除链表元素 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整合技术组件基本流程&#xff1a; 引入组件启动器依赖坐标覆盖默认配置即application.properties配置文件(每个微服务只有一个并且服务启动默认加载)引导类(微服务入口即main方法)自定义开启组件注解 SpringCloudEureka 服务注册中心&#xff0c;分为Eure…...

Echart的使用初体验,Echarts的基本使用及语法格式,简单图表绘制和使用及图例添加【学习笔记】

Echart&#xff1f; ECharts 是一个使用 JavaScript 实现的开源可视化库&#xff0c;涵盖各行业图表&#xff0c;满足各种需求。 ECharts 遵循 Apache-2.0 开源协议&#xff0c;免费商用。 ECharts 兼容当前绝大部分浏览器&#xff08;IE8/9/10/11&#xff0c;Chrome&#xf…...

聊聊腾讯T13技术专家被开除

这两天腾讯的技术大佬stonehuang被曝离开腾讯&#xff0c;据他老婆在小红书上发的帖子称是遭遇了裁员&#xff0c;说实话刚看到这个消息我挺震惊的&#xff0c;stonehuang在中国大前端领域是排得上号的专家&#xff0c;同时他2005年就加入了腾讯&#xff0c;在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 进行限制&#xff0c;这是 QUIC 以及类似 UDP-Based 协议的推广阻力之一&#xff0c;上了线很多问题&#xff0c;丢包&#xff0c;慢等的问题严重增加运维&#xff0c;运营成本。 按照运营商五元组 QoS 这种简单粗暴不惹事的原则&#xff0c;只要换一个端口就可…...

C#基础教程22 异常处理

文章目录 C# 异常处理语法C# 中的异常类异常类 描述异常处理创建用户自定义异常C# 异常处理 异常是在程序执行期间出现的问题。C# 中的异常是对程序运行时出现的特殊情况的一种响应,比如尝试除以零。 异常提供了一种把程序控制权从某个部分转移到另一个部分的方式。C# 异常处理…...

java八股文--java基础

java基础1.什么是面向对象&#xff0c;谈谈对面向对象的理解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数据&#xff0c;而是通过spark读取hive jdbc的方式访问hive数据&#xff0c;因为这个hive有kerberos认证&#xff0c;在网上也不是很容易搜索到这样的操作案例。不多bb&#xff0c;直接上教程。 准备工作 准备一个hiv…...

【Maven】项目中pom.xml坐标定义以及pom基本配置

目录 一、pom.xml坐标定义 二、pom 基本配置 一、pom.xml坐标定义 在 pom.xml 中定义坐标&#xff0c;内容包括&#xff1a;groupId、artifactId、version&#xff0c;详细内容如下&#xff1a; <!--项目名称&#xff0c;定义为组织名项目名&#xff0c;类似包名-->&l…...

Linux GCC 编译详解

文章目录一、GCC 编译器简介二、GCC 工作流编程语言的发展GCC 工作流程gcc 和 g 的区别三、使用 GCC 编译GCC 编译格式GCC 编译流程多个源文件编译一、GCC 编译器简介 首先&#xff0c;什么是编译器呢&#xff1f; 我们可以使用编辑器&#xff08;如 linux 下的 vi、windows 下…...

谁说程序员不懂了浪费,女神节安排

Python的PyQt框架的使用一、前言二、女神节文案三、浪漫的代码四、官宣文案一、前言 个人主页: ζ小菜鸡大家好&#xff0c;我是ζ小菜鸡&#xff0c;特在这个特殊的日子献上此文&#xff0c;希望小伙伴们能讨自己的女神欢心。 二、女神节文案 1.生活一半是柴米油盐&#xff0c…...

上市公司管理层短视指标(2007-2020)

1、数据说明&#xff1a;将研发⽀出的减少量&#xff08;∆R&D&#xff09;作为管理层短视⾏为的度量指标&#xff0c;即∆R&D为公司t年的研发⽀出减去t-1年的研发⽀出并除以t-1年末的总资产再乘以100。2、数据来源&#xff1a;自主整理3、时间跨度&#xff1a;2007-20…...

IDDPM 和 DDIM 对比

IDDPM 和 DDPM 对比IDDPMDDIMIDDPM IDDPM&#xff1a;Improved Denoising diffusion probabilistic models learning Σθ\Sigma_{\theta}Σθ​&#xff0c; 即Σθ(xt,t)exp⁡(vlog⁡βt(1−v)log⁡β~t)\Sigma_{\theta}\left(x_{t}, t\right)\exp \left(v \log \beta_{t}(1…...

链表OJ题(上)

✅每日一练&#xff1a;876. 链表的中间结点 - 力扣&#xff08;LeetCode&#xff09; 解题思路&#xff1a; 定义快慢指针&#xff0c;让快指针走2步&#xff0c;慢指针走1步&#xff0c;当fast或者fast.next为空时&#xff0c;走完链表&#xff0c;此时slow就是中间位置 pub…...

【题解】百度2021校招Web前端工程师笔试卷(第一批):单选题、多选题

题目来源&#xff1a;牛客网公司真题_免费模拟题库_企业面试|笔试真题 (nowcoder.com) 若有错误请指正&#xff01; 单选题 1 某主机的 IP 地址为 212.212.77.55&#xff0c;子网掩码为 255.255.252.0。若该主机向其所在子网发送广播分组&#xff0c;则目的地址可以是&…...

论文解读:SuperPoint: Self-Supervised Interest Point Detection and Description

发表时间: 2018年 项目地址&#xff1a;https://arxiv.org/abs/1712.07629 论文地址&#xff1a;https://github.com/magicleap/SuperPointPretrainedNetwork 本文提出了一种用于训练计算机视觉中大量多视点几何问题的兴趣点检测器和描述符的自监督框架。与patch-based的神经网…...

游戏玩的多,陪玩你了解的多吗?用Python来采集陪玩数据,看看行情和美照

前言 (&#xff61;&#xff65;∀&#xff65;)&#xff89;&#xff9e;嗨 大家好 现在应该每个人都玩过游戏吧&#xff0c;有些的上瘾&#xff0c;天天玩停不下来&#xff0c;有些的倒是没啥感觉 有游戏就肯定有陪玩啊&#xff0c;毕竟当朋友忙的时候&#xff0c;自己一个…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

爬虫基础学习day2

# 爬虫设计领域 工商&#xff1a;企查查、天眼查短视频&#xff1a;抖音、快手、西瓜 ---> 飞瓜电商&#xff1a;京东、淘宝、聚美优品、亚马逊 ---> 分析店铺经营决策标题、排名航空&#xff1a;抓取所有航空公司价格 ---> 去哪儿自媒体&#xff1a;采集自媒体数据进…...

蓝桥杯3498 01串的熵

问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798&#xff0c; 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...

C++.OpenGL (14/64)多光源(Multiple Lights)

多光源(Multiple Lights) 多光源渲染技术概览 #mermaid-svg-3L5e5gGn76TNh7Lq {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-3L5e5gGn76TNh7Lq .error-icon{fill:#552222;}#mermaid-svg-3L5e5gGn76TNh7Lq .erro…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机

这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机&#xff0c;因为在使用过程中发现 Airsim 对外部监控相机的描述模糊&#xff0c;而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置&#xff0c;最后在源码示例中找到了&#xff0c;所以感…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

【C++】纯虚函数类外可以写实现吗?

1. 答案 先说答案&#xff0c;可以。 2.代码测试 .h头文件 #include <iostream> #include <string>// 抽象基类 class AbstractBase { public:AbstractBase() default;virtual ~AbstractBase() default; // 默认析构函数public:virtual int PureVirtualFunct…...

Kubernetes 节点自动伸缩(Cluster Autoscaler)原理与实践

在 Kubernetes 集群中&#xff0c;如何在保障应用高可用的同时有效地管理资源&#xff0c;一直是运维人员和开发者关注的重点。随着微服务架构的普及&#xff0c;集群内各个服务的负载波动日趋明显&#xff0c;传统的手动扩缩容方式已无法满足实时性和弹性需求。 Cluster Auto…...

MySQL体系架构解析(三):MySQL目录与启动配置全解析

MySQL中的目录和文件 bin目录 在 MySQL 的安装目录下有一个特别重要的 bin 目录&#xff0c;这个目录下存放着许多可执行文件。与其他系统的可执行文件类似&#xff0c;这些可执行文件都是与服务器和客户端程序相关的。 启动MySQL服务器程序 在 UNIX 系统中&#xff0c;用…...