【算法-链表3】删除链表倒数第n个节点 + 链表相交

news2024/11/26 8:21:06

今天,带来XXX的讲解。文中不足错漏之处望请斧正!

理论基础点这里


删除链表倒数第n个节点

1. 思路

直接计算

倒数第n个 = 正数第size-n+1个

比如要删除size为5的链表的倒数第2个节点。

在这里插入图片描述

其实就是正数size-n+1个。那么,从第一个走到底size-n+1个需要几步呢?恰好是size-n步。

当然,这不符合题目进阶的要求,我们仅仅是获取大小就已经扫描了一遍链表。而我们扫描完,计算要走的步数后,还要进行扫描。

双指针法

快指针先走n步,而后快慢指针一起走:当快指针为空,慢指针恰好指向倒数第n个节点。

在这里插入图片描述

是怎么想到的呢?

倒数的本质不就是结尾和某个位置的距离嘛:倒数第2个,即距离结尾的null有2步的距离;倒数第3个即距离结尾的null有3步的距离。

那我们要删除slow(图中的4),要能找到3。怎么做呢?找要删除的节点的前一个即可!

我们给一个虚拟头结点dummyHead,slow和fast从dummyHead开始,这样当fast→next为空的时候,slow指向倒数第n个节点的前一个。

在这里插入图片描述

2. 参考代码

class Solution {
public:
    int getSize(ListNode *head) {
        int size = 0;
        while (head != nullptr) {
            head = head->next;
            ++size;
        }
        return size;
    }

    ListNode* removeNthFromEnd(ListNode* head, int n) {
        ListNode *dummyHead = new ListNode(-1, head);
        ListNode *cur = head;

        // 找到倒数第n个结点, 即正数第 size-n+1 个结点
        // 从第一个节点走到正数第 size-n+1 个节点只需要 size-n 步
        int steps = getSize(head) - n;
        // 找要删除的节点的前一个位置, 所以从head的前一个开始找
        cur = dummyHead;
        for (int i = 0; i < steps; ++i) cur = cur->next; 
        ListNode *dying = cur->next;
        cur->next = cur->next->next; // 1 <= n <= sz 所以不会访问空指针
        delete dying;

        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};
class Solution {
public:
    ListNode *removeNthFromEnd(ListNode *head, int n) {
        ListNode *dummyHead = new ListNode(-1, head);
        ListNode *slow = dummyHead;
        ListNode *fast = dummyHead;

        for (int i = 0; i < n; ++i) fast = fast->next; // 先走n步
        while (fast->next != nullptr) { // 一起走
            slow = slow->next;
            fast = fast->next;
        }

        ListNode *dying = slow->next;
        slow->next = slow->next->next; // 删除节点
        delete dying;

        head = dummyHead->next;
        delete dummyHead;
        return head;
    }
};

链表相交

1. 思路

我们想直接遍历两个head是行不通的,因为长度不一定相同,可能链表本身相交,但两个head错过了。所以可以先同步,这样同时遍历两个head就能找到相交节点了。

在这里插入图片描述

在这里插入图片描述
消除长度差后,既可以直接判断两指针本身,也可以判断两指针的下一个位置。

2. 参考代码

class Solution {
public:
    ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        // 1. 计算长度差gap
        int sizeA = getSize(headA);
        int sizeB = getSize(headB);
        int gap = abs(sizeA - sizeB);

        // 2. 长的链表先走gap步 -- 二表长度相同
        ListNode *&longList = sizeA > sizeB ? headA : headB;
        while (gap--) longList = longList->next;

        // 3. 二表同时走, 走某步时两表指针指向同一个元素就表示链表在此处相交
        while (headA != nullptr) {
            if (headA == headB) return headA;
            headA = headA->next;
            headB = headB->next;
        }

        return nullptr;
    }
private:
    int getSize(ListNode *head) {
        int size = 0;
        while (head != nullptr) {
            head = head->next;
            ++size;
        }
        return size;
    }
};

今天的分享就到这里了,感谢您能看到这里。

这里是培根的blog,期待与你共同进步!

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

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

相关文章

【uniapp uview】u--textarea组件custom validator check failed for prop “confirmType“

加一行&#xff1a;confirmType"done"即可。<UTextarea> at node_modules/uview-ui/components/u-textarea/u-textarea.vue<UTextarea> at node_modules/uview-ui/components/u--textarea/u--textarea.vueat pages/notice/noticeDetail.vueuview 文档地址…

73.矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]]示例 2&#xff1a; 输入&…

每天一点python——day65

#每天一点Python——65 #字符串的内容对齐操作类似于word中左对齐、右对齐、居中对齐如图 #例&#xff1a; s1hello,python print(s1.center(20,*))#设置宽度20&#xff0c;填充图是*s1有12个字符&#xff0c;这个字符串的宽度设置为20&#xff0c; 20-128 因为center是居中对齐…

概念解析 | 雷达协同认知成像:原理、研究现状与挑战

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:雷达协同认知成像。 概念解析 | 雷达协同认知成像:原理、研究现状与挑战 摘要: 雷达协同认知成像,作为一种先进的感知技术,在军事侦察、民用航空、无人驾驶等领域具有广…

GZ038 物联网应用开发赛题第2套

2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第2套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评人员反映,不得扰乱赛场秩序; 3、遵守赛场纪律,尊重考评人员,…

NFS文件系统共享服务器实战

架设一台NFS服务器&#xff0c;并按照以下要求配置 准备 两台Linux虚拟机一台作为服务端server&#xff0c;一台作为客户端client server IPV4&#xff1a;192.168.110.136/24 client IPV4&#xff1a;192.168.110.134/24 两台服务器都需要关闭防火墙和seLinux 服…

基于安卓android微信小程序的物流仓储系统

项目介绍 本文以实际运用为开发背景&#xff0c;运用软件工程原理和开发方法&#xff0c;它主要是采用java语言技术和mysql数据库来完成对系统的设计。整个开发过程首先对物流仓储系统进行需求分析&#xff0c;得出物流仓储系统主要功能。接着对物流仓储系统进行总体设计和详细…

微信支付(JSAPI支付)接入流程

一、 常用支付方式 微信当前支持的支付产品有如下这些: 可以根据自己的需要选择接入的支付方式。 接入指引 我们常用的支付方式:JSAPI支付 Native支付 APP支付 JSAPI支付: 商家张贴收款码物料,用户打开扫一扫,扫码后输入金额,完成付款Native支付: 商家在系统中按微信支…

Tomcat隐藏版本号和关闭默认管理页面

一. 隐藏Tomcat异常页面中的版本信息&#xff0c;Tomcat服务器版本号泄露 Tomcat/8.5.xx相关版本号等信息&#xff0c;是不安全的。这会被黑客获取到&#xff0c;利用该版本的其他漏洞对服务器进行异常操作&#xff0c;所以需要隐藏掉。 进入tomcat安装目录 apache-tomcat-8.…

MySQL系列-win10安装MySQL

MySQL系列-win10安装MySQL 1. MySQL系列-win10安装MySQL1.1MySQL下载安装MySQL5.71.2MySQL下载再安装MySQL8.0 未完待续 1. MySQL系列-win10安装MySQL 1.1MySQL下载安装MySQL5.7 下载地址 https://www.mysql.com/downloads/ 进入后&#xff0c;下拉页面&#xff0c;最下面有社…

Zabbix自定义监控内容案例(自动发现、自动注册)

一、自定义监控内容 案例&#xff1a;自定义监控客户端服务器登录的人数 需求&#xff1a;限制登录人数不超过3个人&#xff0c;超过5个人就发出报警 1、在客户端创建自定义key 创建Zabbix监控项配置文件&#xff0c;用于自定义Key #在zabbix的配置文件中定义了会加载放在/e…

Zabbix“专家坐诊”第210期问答汇总

问题一 Q&#xff1a;zabbix触发器条件基于历史趋势的函数有示例吗&#xff1f;还有这些基于历史趋势的函数&#xff0c;具体是读取历史表还是趋势表&#xff1f; A&#xff1a;读历史表&#xff0c;示例可以看看官网的。 https://www.bookstack.cn/read/zabbix-5.0-zh/37cf0…

前端批量下载文件(干货)

如果可以实现记得点赞分享&#xff0c;谢谢老铁&#xff5e; 1.常见的下载方式 (1) window.open() (2) 通过 标签绑定url (3) 通过请求后台API接口进行下载 2.推荐方式 &#xff08;1&#xff09;如果是下载单个文件的 直接用window.open(url, ‘打开方式’) 这里的打开方…

Git 分支设计规范

开篇 这篇文章分享 Git 分支设计规范&#xff0c;目的是提供给研发人员做参考。 规范是死的&#xff0c;人是活的&#xff0c;希望自己定的规范&#xff0c;不要被打脸。 在说 Git 分支规范之前&#xff0c;先说下在系统开发过程中常用的环境。 DEV 环境&#xff1a;用于开发…

rtklib的rtknavi使用

1、点击rtknavi工具 2、配置输入的数据流 采用香港基准站的实时数据流&#xff0c;进行验证。 输入caster的地址 landsd-gncaster.realtime.data.gov.hk 选择HKSS 和HKWS 配置Options 点击运行

2023亚太杯数学建模A题B题C题思路汇总分析

文章目录 0 赛题思路1 竞赛信息2 竞赛时间3 建模常见问题类型3.1 分类问题3.2 优化问题3.3 预测问题3.4 评价问题 4 建模资料5 最后 0 赛题思路 &#xff08;赛题出来以后第一时间在CSDN分享&#xff09; https://blog.csdn.net/dc_sinor?typeblog 1 竞赛信息 2023年第十三…

[黑马程序员Pandas教程]——合并与变形

目录&#xff1a; 学习目标Dataframe合并 df.append函数纵向追加合并dfpd.concat函数纵向横向连接多个数据集df.merge合并指定关联列的多个数据集df.join横向合并索引值相同的多个数据集df合并小结Dataframe变形 df.T行列转置df.stack()和s.unstack()变形df.melt宽变长将列名变…

企业该怎么选择泛域名https证书

随着互联网技术的不断进步&#xff0c;网络安全技术也在不断发展&#xff0c;https数字证书技术也在不断进步。现在&#xff0c;为了迎合市场需求&#xff0c;CA认证机构开发了多种类型的https数字证书&#xff0c;而泛域名https证书可以有效地保护多个网站客户的个人隐私和信息…

通信原理板块——图像压缩编码

微信公众号上线&#xff0c;搜索公众号小灰灰的FPGA,关注可获取相关源码&#xff0c;定期更新有关FPGA的项目以及开源项目源码&#xff0c;包括但不限于各类检测芯片驱动、低速接口驱动、高速接口驱动、数据信号处理、图像处理以及AXI总线等 1、图像压缩编码 图像压缩编码可以…

增强group by的使用

-- (1) 显示某种岗位的雇员总数、平均工资 SELECT COUNT(empno),FORMAT(AVG(sal),2) AS avg_sal,jobFROM empGROUP BY job; -- (2) 显示雇员总数&#xff0c;以及获得补助的雇员数 SELECT COUNT(*) AS emp_total,COUNT(comm) AS emonyFROM emp;-- (3) 统计获得补助的非空补助的…