【算法集训】基础数据结构:三、链表

链表就是将所有数据都用一个链子串起来,其中链表也有多种形式,包含单向链表、双向链表等;
现在毕竟还是基础阶段,就先学习单链表吧;
链表用头结点head表示一整个链表,每个链表的节点包含当前节点的值val和下一个节点next
链表的好处就是删除和插入比较容易,不需要移动其他元素。只需要改变下一个节点的指向值即可。

第一题 面试题 02.02. 返回倒数第 k 个节点

https://leetcode.cn/problems/kth-node-from-end-of-list-lcci/description/
返回第k个节点的值,这里使用双指针的思路,定义一个快指针和慢指针,两个指针之间间隔k位,快指针移动到最后一个节点的下一个节点(即节点为空时)时就停止,此时慢指针对应的就是倒数第k个节点值。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/int kthToLast(struct ListNode* head, int k){struct ListNode * fast = head;struct ListNode * slow = head;for(int i = 0; i < k; ++i) {fast = fast->next;}while(fast) {fast = fast->next;slow = slow->next;}return slow->val;
}

第二题 19. 删除链表的倒数第 N 个结点

https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/
删除倒数第n个节点,思路和上一题一样,先找到倒数第N个节点,我们要删除这个节点,所以需要找到这个节点的前一个节点N+1
直接将下一个值指向N的下一个值即可。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* removeNthFromEnd(struct ListNode* head, int n) {struct ListNode * fast = head;struct ListNode * slow = head;for(int i = 0; i < n; ++i) {fast = fast->next;if(fast == NULL) {return head->next;}}fast = fast->next;while(fast) {fast = fast->next;slow = slow->next;}slow->next = slow->next->next;return head;}

第三题 206. 反转链表

https://leetcode.cn/problems/reverse-linked-list/description/

第一种:迭代方法,定义一个当前节点cur和前一个节点pre,遍历链表,将指向换一下方向即可,注意保存cur->next

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* reverseList(struct ListNode* head) {struct ListNode * pre = NULL;struct ListNode * cur = head;while(cur) {struct ListNode * temp = cur->next;cur->next = pre;pre = cur;cur = temp;}return pre;
}

第二种:递归
主要思想就是从最后一个开始,将它的指针指向前一个节点,然后前一个节点指向NULL;
这时又递归到前一个节点,和上面操作一样,一直到第一个头结点,这时头结点会置为NULL;

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/struct ListNode * doReverse(struct ListNode * head, struct ListNode ** outHead) {递归临界点,如果到最后一个节点则开始往回走;if(head == NULL || head->next == NULL) {*outHead = head;  outhead是最终翻转后的头结点,所以这里head最后一个节点就是outhead的头结点return head;}
每次递归都向下一层,返回值为反转后的struct ListNode * tail = doReverse(head->next, outHead);tail->next = head;head->next = NULL;return head;
}struct ListNode* reverseList(struct ListNode* head) {struct ListNode * outHead;doReverse(head, &outHead);return outHead;
}

第四题 237. 删除链表中的节点

https://leetcode.cn/problems/delete-node-in-a-linked-list/description/
这道题代码不难,主要的是思想,能不能想到这样的方法。
只给了一个需要删除的节点node,让你删除这个节点。
那么我们只需要将node->next的值赋值给node,那么这样就可以删除node->next,这样同样可以达到需要的结果。

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
void deleteNode(struct ListNode* node) {node->val = node->next->val;node->next = node->next->next;
}

第五题 24. 两两交换链表中的节点

https://leetcode.cn/problems/swap-nodes-in-pairs/description/
本题有两种做法,迭代和递归,递归相对来说难理解。
一、递归

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     struct ListNode *next;* };*/
struct ListNode* swapPairs(struct ListNode* head) {定义临界点,即递到最后一个节点或者空时开始归。if(head == NULL || head->next == NULL) {return head;}这里就是记录递归的当前节点和下一个节点,用于后续交换struct ListNode* now = head;struct ListNode* next = head->next;这里记录的是后面已经完成交换的头结点nextnext;struct ListNode* nextnext = swapPairs(now->next->next);这里算是核心,now->next = nextnext;  每次将当前节点的下个节点指向已经完成交换的头结点next->next = now;  将当前节点下一个节点又指向当前节点,即完成本轮交换return next;
}

二、迭代

/*** 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:ListNode* swapPairs(ListNode* head) {ListNode * virhead = new ListNode();virhead->next = head;ListNode * cur = virhead;while (cur->next != nullptr && cur->next->next != nullptr) {ListNode * temp1 = cur->next;ListNode * temp2 = cur->next->next->next;cur->next = cur->next->next;cur->next->next = temp1;cur->next->next->next = temp2;cur = cur->next->next;}return virhead->next;}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python源码保护】02 - pyc

1. python编译过程 Python虽然是一门解释型语言&#xff0c;但Python程序执行时&#xff0c;也需要将源码进行编译生成字节码&#xff0c;然后由Python虚拟机进行执行&#xff0c;因此Python解释器实际是由两部分组成&#xff1a;编译器和虚拟机。 Python程序执行过程和Java类…

C语言--不使用库函数,把一个数字转为字符串【详细解释】

一.题目描述 输入一个数字&#xff0c;把他转为字符串 比如&#xff1a;输入数字&#xff1a;12345 输出&#xff1a;12345&#xff08;这里的12345是字符串12345&#xff09; 二.思路分析 比如给定一个数字12345&#xff0c;先把它转为字符54321&#xff08;“54321”&#…

处理器中的TrustZone之安全状态

在这篇博客中&#xff0c;我们将讨论处理器内对TrustZone的支持。其他部分则涵盖了在内存系统中的支持&#xff0c;以及建立在处理器和内存系统支持基础上的软件情况。 3.1 安全状态 在Arm架构中&#xff0c;有两个安全状态&#xff1a;安全状态和非安全状态。这些安全状态映射…

区块链密码学:基础知识、应用与未来发展

一、引言 区块链技术&#xff0c;作为一种分布式、去中心化的数据管理方式&#xff0c;密码学在其安全性和可靠性方面发挥着至关重要的作用。本文将详细介绍区块链密码学的基础知识、应用以及未来发展趋势。 二、区块链密码学基础知识 区块链密码学是区块链技术的核心组成部分…

深入理解 Java 虚拟机(JVM)从入门到精通

目录 一、JVM内存结构1、堆&#xff08;Heap&#xff09;&#xff08;1&#xff09;特点&#xff08;2&#xff09;堆内存分配&#xff08;3&#xff09;晋升到老年代的方式&#xff08;4&#xff09;堆内存检验方式2、虚拟机栈&#xff08;VM Stack&#xff09;&#xff08;1&…

Logstash使用指南

介绍 Logstash是一个开源数据收集引擎&#xff0c;具有实时管道功能。它可以动态地将来自不同数据源的数据统一起来&#xff0c;并将数据标准化到你所选择的目的地。尽管Logstash的早期目标是搜集日志&#xff0c;现在它的功能已完全不只于此。任何事件类型都可以加入分析&…

机械行业解决云存储的企业云盘推荐

随着科技的飞速发展&#xff0c;机械行业在取得显著成果的同时&#xff0c;也面临着一些独特的挑战。本文将深入探讨机械行业所面临的主要问题&#xff0c;并详细介绍Zoho WorkDrive企业云盘所提供的解决方案&#xff0c;以帮助企业应对这些挑战。 一、机械行业面临的主要问题 …

JavaScript添加快捷键、取消浏览器默认的快捷操作、js查看键盘按钮keycode值

document.addEventListener("keydown",function (event) {// 如果不知道按键对应的数字&#xff08;keyCode&#xff09;是多少可以弹出查看一下// alert(event.keyCode)if (event.ctrlKey && event.altKey && event.view["0"] null){if(…

zabbix配置snmp trap--使用snmptrapd和Bash接收器--图文教程

1.前言 我的zabbix的版本是5.0版本&#xff0c;5.0的官方文档没有使用bash接收器的示例&#xff0c;6.0的官方文档有使用bash接收器的示例&#xff0c;但是&#xff0c;下载文件的链接失效&#xff1f;&#xff01; 这里讲解zabbix-server端配置和zabbix web端配置 2.zabbix-…

赛事回顾 | 首届“智航杯“全国无人机智能算法竞赛落幕

11月28日&#xff0c;首届“智航杯”全国无人机智能算法竞赛实物赛在海南省三亚市成功落下帷幕。此次竞赛自2023年4月启动以来&#xff0c;共有来自全国145所高等院校和50多所企事业单位的1253支团队、3655人报名参赛&#xff0c;最终有6支队伍脱颖而出&#xff0c;入围了实物赛…

<蓝桥杯软件赛>零基础备赛20周--第9周--前缀和与差分

报名明年4月蓝桥杯软件赛的同学们&#xff0c;如果你是大一零基础&#xff0c;目前懵懂中&#xff0c;不知该怎么办&#xff0c;可以看看本博客系列&#xff1a;备赛20周合集 20周的完整安排请点击&#xff1a;20周计划 每周发1个博客&#xff0c;共20周&#xff08;读者可以按…

Stable Diffusion 系列教程 - 1 基础准备(针对新手)

使用SD有两种方式&#xff1a; 本地&#xff1a; 显卡要求&#xff1a;硬件环境推荐NVIDIA的具有8G显存的独立显卡&#xff0c;这个显存勉勉强强能摸到门槛。再往下的4G可能面临各种炸显存、炼丹失败、无法生成图片等各种问题。对于8G显存&#xff0c;1.0模型就不行&#xff0…

微服务实战系列之EhCache

前言 书接前文&#xff0c;继续深耕。上一篇博主对Redis进行了入门级介绍&#xff0c;大体知道了Redis可以干什么以及怎么使用它。 今日博主继续带着大家学习如何使用EhCache&#xff0c;这是一款基于Java的缓存框架。 微服务实战系列之Redis微服务实战系列之Cache微服务实战…

tomcat环境搭建

镜像下载地址&#xff1a;https://mirror.tuna.tsinghua.edu.cn/apache/tomcat/ 配置环境变量 添加系统变量 编辑Path 测试 dos窗口运行startup启动tomcat 访问http://localhost:8080/

孩子都能学会的FPGA:第二十四课——用FPGA和格雷码实现异步FIFO

&#xff08;原创声明&#xff1a;该文是作者的原创&#xff0c;面向对象是FPGA入门者&#xff0c;后续会有进阶的高级教程。宗旨是让每个想做FPGA的人轻松入门&#xff0c;作者不光让大家知其然&#xff0c;还要让大家知其所以然&#xff01;每个工程作者都搭建了全自动化的仿…

『TypeScript』从零开始编写你的第一个TypeScript程序

&#x1f4e3;读完这篇文章里你能收获到 了解TypeScript及为什么使用TypeScriptTypeScript的安装过程编写第一个HelloTs程序 文章目录 一、TypeScript简介1. 什么是TypeScript&#xff1f;2. 为什么选择使用TypeScript&#xff1f;2.1 静态类型检查2.2 更好的代码维护性2.3 更…

【尘缘送书第五期】Java程序员:学习与使用多线程

目录 1 多线程对于Java的意义2 为什么Java工程师必须掌握多线程3 Java多线程使用方式4 如何学好Java多线程5 参与方式 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀活动&#xff0c;社交平台的实时消息推送&#xff0c;还是在线视频平台的流量洪峰…

【头歌实训】分布式文件系统 HDFS

文章目录 第1关&#xff1a;HDFS的基本操作任务描述相关知识HDFS的设计分布式文件系统NameNode与DataNode HDFS的常用命令 编程要求测试说明答案代码 第2关&#xff1a;HDFS-JAVA接口之读取文件任务描述相关知识FileSystem对象FSDataInputStream对象 编程要求测试说明答案代码 …

基于单片机设计的激光测距仪(采用XKC-Kl200模块)

一、前言 随着科技的不断进步和应用需求的增加&#xff0c;测距仪成为了许多领域必备的工具之一。传统的测距仪价格昂贵、体积庞大&#xff0c;使用起来不够方便。本项目采用STC89C52单片机作为主控芯片&#xff0c;结合XKC-KL200激光测距模块和LCD1602显示器&#xff0c;实现…

ZKP Understanding Nova (2) Relaxed R1CS

Understanding Nova Kothapalli, Abhiram, Srinath Setty, and Ioanna Tzialla. “Nova: Recursive zero-knowledge arguments from folding schemes.” Annual International Cryptology Conference. Cham: Springer Nature Switzerland, 2022. Nova: Paper Code 2. Unders…