【算法专题】链表算法题

1. 链表常用操作

        相信大家在学习数据结构的过程中已经接触过许多链表相关的题目了,在正式开始刷题之前,我想让大家先回顾一下过去处理链表相关问题时的一些常见操作。        

        首先肯定就是创建新节点了,如果使用C语言编写代码,我们需要自己用malloc函数分配内存,然后手动初始化节点,而使用C++就简单多了,直接new就行。然后是链表的尾插,这也非常简单,我们定义一个tail指针始终指向链表的尾部,当进行尾插时,令链表尾部的next指向尾插的节点,然后tail指针重新指向新的链表尾部即可。还有就是头插,如果我们直接进行头插操作,需要对链表为空的情况进行处理,但如果引入虚拟头节点newhead的话,就可以省去对边界情况的讨论,只需要令新节点指向newhead的next,然后newhead指向新节点,这样就非常方便的实现了头插。

        在这里我还想讲一些做链表题时的常用技巧,首先是画图,这有助于我们直观形象地理解题目,在处理比较复杂地题目时很有帮助;还有就是前面提到过的虚拟头节点,有了虚拟头节点,我们能够省去对许多边界情况的讨论,大大降低了代码编写的复杂程度;最后一点,我们大可不必吝啬定义一些辅助的变量,这能避免我们把自己都搞混乱了,举个例子:

相信大家如果经历过数据结构的卷面考试的话,对这种坑爹的题目肯定是不陌生的,令人看得眼花缭乱,出于考核的目的,这无可厚非,但我们自己写代码就没必要这样折磨自己了吧,直接定义一个next指针,指向prev的next,编写代码将会轻松许多。

2. 两数相加

2. 两数相加 - 力扣(LeetCode)

        本题要求我们将以链表形式逆序储存的两个数字进行相加,经常做加法的同学都知道,这实际上是降低了我们编写代码的难度,因为我们的加法运算本来就是从低位到高位进行的呀。所以我们只需要模拟加法这个过程,对两个链表进行遍历,当两个链表非空时进行相加,为了处理进位的情况,我们可以创建变量t来进行辅助运算,根据加法运算逢十进一的性质,把两个链表元素相加的结果加到t,对t取模10后添加到要返回的链表中,t除以10的结果就是进位数更新到t。只要两个链表有一个不为空或者t不为0,我们就继续运算,直到计算完毕为止。

        正如我们在常用操作那里提到的,要返回的链表我们也可以设置一个虚拟头节点,这有助于我们更轻松地编写代码,在最后,我们还需要把虚拟头节点new出来的空间销毁掉。

class Solution {
public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {ListNode *newhead = new ListNode(0);ListNode *cur = newhead, *cur1 = l1, *cur2 = l2;int t = 0;while(cur1 || cur2 || t){if(cur1){t += cur1->val;cur1 = cur1->next;}if(cur2){t += cur2->val;cur2 = cur2->next;}cur->next = new ListNode(t % 10);t /= 10;cur = cur->next;}cur = newhead->next;delete newhead;return cur;}
};

3. 两两交换链表节点

24. 两两交换链表中的节点 - 力扣(LeetCode)

        根据题意,我们需要把题目所给链表中的元素按两个一组的形式两两交换,并且不能只是修改链表元素的值,必须进行交换。在这里我们用迭代的方式来解决这道题,并且本题也是可以引入虚拟头节点来方便我们代码编写的。

       

如图所示,如果我们不引入虚拟头节点,最前面的两个节点的交换和后续节点的交换方式是不同的,这是因为此时首个节点并没有前驱节点,那我们就需要先设定好第二个节点作为新的头节点,而后续节点均有前驱节点,不需要进行这个步骤。如果这样的话,我们写代码就会麻烦些,但引入虚拟头节点后,首节点也有了前驱节点,这样我们就能用同一个逻辑处理所有节点了。

        

        如上图所示,画图对交换过程进行模拟,可以发现当next移动到链表尾端时,我们就能把所有符合的节点两两进行交换,接下来只要编写代码实现即可。

class Solution {
public:ListNode* swapPairs(ListNode* head) {if(!head || !head->next) return head;ListNode *newhead = new ListNode(0, head);ListNode *prev = newhead, *cur = head;while(cur && cur->next){ListNode *next = cur->next, *nnext = next->next;prev->next = next;next->next = cur;cur->next = nnext;prev = cur;cur = nnext;}return newhead->next;}
};

4. 重排链表

143. 重排链表 - 力扣(LeetCode)

        想必通过题目的描述,大家都能清晰地理解要求是什么,我们需要将链表的节点进行交换,最后链表被变换为首尾交替的状态。这个结果可以通过三个步骤得到:1. 找到链表的中间节点,并把链表从中间断开分为两个链表  2. 将后面的链表进行反转   3. 将前面的链表和反转后的链表合并

        这样看的话,其实每个步骤用到的知识点都不同,我们可以通过快慢指针找到链表的中间节点、头插法将后面的链表进行反转、最后合并链表。所以这是一道综合性比较强的题,能够锻炼到我们的代码能力,并且由于能一次性考好几个知识点,也是面试官喜欢出的类型。

        

class Solution {
public:void reorderList(ListNode* head) {// 当链表只有一个或两个时,不需要变换if(!head->next || !head->next->next) return;// 两个指针,一个一次走两步,一个一次走一步,则当快指针走完时,慢指针刚好走到中间节点ListNode *f = head, *s = head;while(f && f->next){s = s->next;f = f->next->next;}ListNode *prev = s->next;s->next = nullptr; // 将链表分为两张ListNode *newhead = new ListNode(0); while(prev){ListNode *next = prev->next; // 提前记录下一个节点,避免丢失prev->next = newhead->next;newhead->next = prev;prev = next;}ListNode *ret = new ListNode(0);ListNode *cur1 = head, *cur2 = newhead->next, *cur = ret;// 前面的链表肯定大于等于后面的链表while(cur1){cur->next = cur1;cur1 = cur1->next;cur = cur->next;if(cur2){cur->next = cur2;cur2 = cur2->next;cur = cur->next;}}// 释放空间delete ret;delete newhead;}

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

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

相关文章

Mac m1安装 MongoDB 7.0.12

一、下载MongoDB MongoDB 社区版官网下载 二、安装配置MongoDB 1.解压下载的压缩包文件,文件夹重命名为mongodb; 2.将重命名为mongodb的文件夹,放在/usr/local 目录下 3.在/usr/local/mongodb 目录下,新建data 和 log这两个文件夹&#…

基于VUE的软件项目开发管理系统/项目管理系统/软件开发过程管理系统的设计与实现

摘 要 在Internet高速发展的今天,我们生活的各个领域都涉及到计算机的应用,其中包括软件项目开发管理系统的网络应用,在外国软件项目开发管理系统已经是很普遍的方式,不过国内的软件项目开发管理可能还处于起步阶段。软件项目开发…

手把手教你打造自己的AI聊天机器人程序(讯飞星火API)

案例背景 最近发现科大的讯飞星火大模型可以申请API试用了,我一直想用chatgpt的API,一是因为收费买不起,二是因为网络不方便..... 现在有了科大讯飞这个国内免费的,当然要试试。 目前讯飞星火可以申请试用他们的模型API&#x…

python: math模块

在Python中,math模块是一个内置的标准库模块,它提供了对浮点数的数学运算支持。这个模块包含了一系列函数和常量,用于执行各种数学计算,比如幂运算、对数计算、三角函数计算、指数计算等。 以下是math模块的一些主要特性和功能&a…

【JavaEE】Spring Boot 自动装配原理(源码分析)

一. 前言 我们在写Spring Boot的程序代码的时候, 可以注入很多我们没有定义过的Bean.例如: Autowired private ApplicationContext applicationContext; Autowired public DataSourceTransactionManager transactionManager; Autowired public AutowireCapableBeanFactory …

【LeetCode】翻转二叉树

目录 一、题目二、解法完整代码 一、题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 示例 2: 输入:root…

一个C++模板工厂的编译问题的解决。针对第三方库的构造函数以及追加了的对象构造函数。牵扯到重载、特化等

一窥模板的替换和匹配方式:偏特化的参数比泛化版本的还要多:判断是不是std::pair<,>。_stdpair模板参数太多-CSDN博客 简介 在一个项目里,调用了第三封的库,这个库里面有个类用的很多,而且其构…

Java语言程序设计基础篇_编程练习题**15.18(使用鼠标来移动一个矩形)

**15.18(使用鼠标来移动一个矩形) 请编写一个程序显示一个矩形。可以使用鼠标单击矩形内部并且拖动(即按住鼠标移动)矩形到鼠标的位置。鼠标点成为矩形的中央习题思路: 新建一个面板Pane(),新建一个Rectangle() 为Rectangle注册…

Cxx Primer-chap7

类的基本思想是数据抽象和封装,前者强调interface和implement分离,后者在此基础上,强调访问控制符(存疑)。同时类的实现者和使用者考虑的角度不同,前者考虑实现效率,后者仅需关注功能即可&#…

猫头虎分享已解决Bug || JSON Parsing Errors: json: cannot unmarshal

猫头虎分享已解决Bug 🐯 || JSON Parsing Errors: json: cannot unmarshal 摘要 在后端开发过程中,处理JSON数据时经常会遇到解析错误,尤其是json: cannot unmarshal错误。这类问题往往由于JSON数据格式与Go语言结构体不匹配引起。今天&…

vue字段判断是否可以鼠标悬浮或者点击跳转

通过字段判断是否可以鼠标悬浮展示颜色 是否点击 <span :class"[converBond.stkindustry ! null ? hoverSpan:,]"click"converBond.stkindustry ! null ?goToIndustry(converBond.stkindustryname,converBond.stkindustry):false">{{converBon…

尚品汇-sku存入Redis缓存(二十三)

目录&#xff1a; &#xff08;1&#xff09;分布式锁改造获取sku信息 &#xff08;2&#xff09;使用Redisson 分布式锁 AOP实现缓存 &#xff08;3&#xff09;定义缓存aop注解 &#xff08;1&#xff09;分布式锁改造获取sku信息 前面学习了本地锁的弊端&#xff0c;…

怎么使用github上传XXX内所有文件

要将 目录中的所有文件上传到 GitHub&#xff0c;你可以按照以下步骤进行&#xff1a; 创建一个新的 GitHub 仓库 登录到你的 GitHub 账户。 点击右上角的加号&#xff08;&#xff09;&#xff0c;选择 “New repository”。 输入仓库名称&#xff08;例如&#xff1a;202407…

走难而正确的路并持之以恒

走难而正确的路并持之以恒 接近八月&#xff0c;台风频繁。气象台说台风“格美”今夜将至&#xff0c;往粤北走&#xff0c;而留在粤东的将是持续的高温。高温的广州&#xff0c;这几晚的天空惊喜不断&#xff0c;成片的火烧云&#xff0c;站在猎德大桥观望&#xff0c;丹红的凤…

数字图像处理笔记(一)---- 图像数字化与显示

系列文章目录 数字图像处理学习笔记&#xff08;一&#xff09;---- 图像数字化与显示 数字图像处理笔记&#xff08;二&#xff09;---- 像素加图像统计特征 数字图像处理笔记&#xff08;三) ---- 傅里叶变换的基本原理 文章目录 系列文章目录前言一、数字图像处理二、图像数…

字符串相加(leetcode算法题)

各位老铁早上好&#xff0c;今天来分享一下我前两天做的leetcode的题目&#xff0c;我个人觉得这两道题目挺经典的&#xff0c;所以打算写这篇博客进行总结&#xff0c;希望各位老铁看完我这篇博客能有所收获。 字符串相加 题目链接 题目要求&#xff1a;你不能使用任何內建…

【Vue实战教程】之 Vue3 新特性详解

1 为什么要用Vue3 在学习Vue3的新特性之前&#xff0c;我们先来看一下Vue3设计的目的是什么&#xff0c;为什么要对Vue2做出很大的改变&#xff0c;以及Vue3到底解决了什么问题。像Vue这样全球闻名的前端框架&#xff0c;在任何一次改动时&#xff0c;设计者都是经过深思熟虑的…

Kithara和Halcon (二)

Kithara使用Halcon QT 进行二维码实时识别 目录 Kithara使用Halcon QT 进行二维码实时识别Halcon 简介以及二维码检测的简要说明Halcon 简介Halcon的二维码检测功能 Qt应用框架简介项目说明关键代码抖动测试测试平台&#xff1a;测试结果&#xff1a; 开源源码 Halcon 简介以…

vue3+vite纯前端实现自动触发浏览器刷新更新版本内容,并在打包时生成版本号文件

前言 在前端项目中&#xff0c;有时候为了实现自动触发浏览器刷新并更新版本内容&#xff0c;可以采取一系列巧妙的措施。我的项目中是需要在打包时候生成一个version.js文件&#xff0c;用当前打包时间作为版本的唯一标识&#xff0c;然后打包发版 &#xff0c;从实现对版本更…

基于SpringBoot的矩形范围面时空分析-以震中附近历史地震为例

目录 前言 1、分析的必要性 2、分析的紧迫性 一、数据库物理模型及空间分析实现 1、数据库物理模型 2、空间数据库中的空间查询分析 二、Java后台程序开发 1、模型层设计 2、业务层的设计与实现 三、WebGIS功能设计与实现 1、同时展示4幅地图 2、初始化地图 3、展示…