【算法day4】链表:应用拓展与快慢指针

news2025/1/9 1:38:52

题目引用


  1. 两两交换链表节点
  2. 删除链表的倒数第n个节点
  3. 链表相交
  4. 环形链表

1.两两交换链表节点


给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(即,只能进行节点交换)。
示例 1:
在这里插入图片描述
输入:head = [1,2,3,4]
输出:[2,1,4,3]
示例 2:
输入:head = []
输出:[]
示例 3:
输入:head = [1]
输出:[1]

我们先来看一下题目,这题跟昨天的翻转链表比较相似,都是控制节点指针对链表进行修改,这里呢我们先new一个虚拟头结点dummyhead来保证到最后可以找到头结点返回,然后定义一个指针curdummyhead位置,tmpcur->next位置来对其进行修改,tmp1用于标记后面节点避免剩余链表丢失。初始化定义
接着将curnext指向tmp的下一个节点
在这里插入图片描述
再将这个节点的next指向tmp节点
在这里插入图片描述
最后将tmp位置节点next指向tmp1,而cur顺势移动到tmp位置进行下一轮交换。
在这里插入图片描述
最后将dummyhead删除,本题就做完啦~
代码:

ListNode* swapPairs(ListNode* head) {
        ListNode* dummyhead=new ListNode(-1);
        dummyhead->next=head;
        ListNode* cur=dummyhead;

        while(cur->next!=nullptr&&cur->next->next!=nullptr){
            ListNode* tmp=cur->next;
            ListNode* tmp1=cur->next->next->next;
            
            cur->next=cur->next->next;
            cur->next->next=tmp;
            tmp->next=tmp1;
            cur=tmp;
        }
        ListNode* result=dummyhead->next;
        delete dummyhead;


        return result;
    }

2.删除链表的倒数第n个节点

给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
示例 1:
在这里插入图片描述
输入:head = [1,2,3,4,5], n = 2
输出:[1,2,3,5]
示例 2:
输入:head = [1], n = 1
输出:[]
示例 3:
输入:head = [1,2], n = 1
输出:[1]

首先我们分析一下题目,这道题目是可以通过遍历两遍的方式做出来的,先遍历一遍算出链表长度,再算出差值,删除节点。但是这里亦可以用快慢指针来做,并且只需要一次遍历。
首先new一个虚拟头结点dummyhead,再定义fastslow指针都指向dummyhead。再我们让fast先移动n+1个节点,再fastslow节点同时移动,直到fast为空。然后删除slow后面的节点返回链表。
为什么是n+1个节点,为什么同时移动呢?
首先回答为什么先让fast先走再同时移动,因为当fastslow同时移动时,fastslow保持了相对距离n+1,当fast移动到链表结束位置时,slow与其刚好相差n+1个节点,也就实现了一次遍历找到倒数第n个节点的期望。
那么为什么是n+1呢?因为当我们找到刚好是倒数第n个位置的节点时,我们对其进行移除操作是很困难的,所以找到倒数第n+1个刚刚好可以将第n个轻易的删除掉。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
附上代码:

ListNode* removeNthFromEnd(ListNode* head, int n) {
        if(head->next==nullptr) return nullptr;

        ListNode* dummyhead=new ListNode(0);
        dummyhead->next=head;
        ListNode* fast=dummyhead;
        ListNode* slow=dummyhead;
        while(n>=0){
            fast=fast->next;

            n--;
        }
        while(fast!=nullptr){
            fast=fast->next;
            slow=slow->next;
        }
        ListNode* tmp=slow->next;
        slow->next=slow->next->next;
        delete tmp;

        return dummyhead->next;
    }

3.链表相交

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点,返回 null 。
图示两个链表在节点 c1 开始相交:
题目数据 保证 整个链式结构中不存在环。
注意,函数返回结果后,链表必须 保持其原始结构 。
示例 1:
在这里插入图片描述

输入:intersectVal = 8, listA = [4,1,8,4,5], listB = [5,0,1,8,4,5], skipA = 2, skipB = 3
输出:Intersected at ‘8’
解释:相交节点的值为 8 (注意,如果两个链表相交则不能为 0)。
从各自的表头开始算起,链表 A 为 [4,1,8,4,5],链表 B 为 [5,0,1,8,4,5]。
在 A 中,相交节点前有 2 个节点;在 B 中,相交节点前有 3 个节点。

这道题很简单,我们先通过两次遍历得到两个链表的长度,然后算出长度差,让长的链表的指针先走长度差gap步,接着两个指针同时移动一一比对,相等即返回。

ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {
        int lenA=0,lenB=0;
        ListNode* curA=headA;
        ListNode* curB=headB;
        while(curA){
            curA=curA->next;
            lenA++;
        }
        while(curB){
            curB=curB->next;
            lenB++;
        }
        curA=headA;curB=headB;
        if (lenB > lenA) {
            swap (lenA, lenB);
            swap (curA, curB);
        }
        // 求长度差
        int gap = lenA - lenB;
        // 让curA和curB在同一起点上(末尾位置对齐)
        while (gap--) {
            curA = curA->next;
        }
        while(curA){
            if(curA==curB){
                return curA;
            }
            curA=curA->next;
            curB=curB->next;
        }
        return NULL;
    }

4.环形链表II

给定一个链表的头节点 head ,返回链表开始入环的第一个节点。 如果链表无环,则返回 null
如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。如果 pos 是 -1,则在该链表中没有环。注意:pos 不作为参数进行传递,仅仅是为了标识链表的实际情况。
不允许修改 链表。
示例 1:
在这里插入图片描述
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点。

首先,我们需要判断一下是否是环形链表,定义一个fast和一个slowfast每次走两步,slow每次走一步,如果有环,那么fastslow一定会在环内的某个位置碰上,因为fastslow有速度差。
那么怎么找到环形链表的开头呢?
这就牵扯到数学问题,设头到环的入口的长度为x,入口到fastslow相遇的位置的长度为y,环剩下的长度为z,那么不难得出

2*(x+y)=n*(y+z)+x+y
x+y=n*(y+z)
x=n*(y+z)-y
x=(n-1)(y+z)+z
那么就说明了从头结点出发一个指针,fast出发一个指针,他们相遇的位置就是环形链表的入口。

那么代码如下:

ListNode *detectCycle(ListNode *head) {
        ListNode* fast=head;
        ListNode* slow=head;
        while(fast&&fast->next){
            fast=fast->next->next;
            slow=slow->next;
            if(slow==fast){
                ListNode* i1=head;
                ListNode* i2=fast;
                while(i1!=i2){
                    i1=i1->next;
                    i2=i2->next;
                    
                }
                return i1;
            }
            
        }
        return NULL;
    }

总结

今天的题目都比较考验画图和发现规律的能力,沉下心好好学习,慢慢寻找总能找到规律。

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

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

相关文章

电子应用设计方案-33:智能AI投影仪系统方案设计

智能 AI 投影仪系统方案设计 一、引言 随着科技的不断进步,投影仪在家庭娱乐、商务办公和教育培训等领域的应用越来越广泛。智能 AI 投影仪作为一种创新的投影设备,结合了人工智能技术,为用户带来更便捷、智能和个性化的使用体验。 二、系统…

Python语法基础(五)

🌈个人主页:羽晨同学 💫个人格言:“成为自己未来的主人~” 首先,我们需要明白一句话,在Python中,一切都是对象 单片机,嵌入式都是面向过程的 面向对象有封装,继承,多态…

pip install causal-conv1d==1.1.1报错

Building wheels for collected packages: causal-conv1d Building wheel for causal-conv1d (setup.py) ... error error: subprocess-exited-with-error python setup.py bdist_wheel did not run successfully. │ exit code: 1 ╰─> [8 lines of output]…

Xcode15(iOS17.4)打包的项目在 iOS12 系统上启动崩溃

0x00 启动崩溃 崩溃日志,只有 2 行,看不出啥来。 0x01 默认配置 由于我开发时,使用的 Xcode 14.1,打包在另外一台电脑 Xcode 15.3 Xcode 14.1 Build Settings -> Asset Catalog Compliter - Options Xcode 15.3 Build S…

14 —— Webpack解析别名

import {checkPhone, checkCode} from ../src/utils/check.js 这么使用相对路径不安全 —— 在webpack.config.js中配置解析别名来代表src绝对路径

SystemUI 下拉框 Build 版本信息去掉

需求及场景 去掉SystemUI 下拉框 Build 版本信息 如下图所示:去掉 12 (SP1A.201812.016) 了解 去掉之前我们先了解它是个什么东西:其实就是一个Build RTM 信息显示 Android_12_build_SP1A.210812.016 修改文件 /frameworks/base/packages/Syste…

基于协同推荐的黔醉酒业白酒销售系统

文末获取源码和万字论文 摘 要 基于协同推荐的黔醉酒业白酒销售系统主要针对黔醉酒业的具体业务需求所设计,现阶段阶段我国大型企业都会有自己的电商平台以及销售管理系统,其功能对于中小型过于冗长复杂,成本也不是中小型企业能够承受的&…

爬虫笔记24——纷玩岛自动抢票脚本笔记

纷玩岛自动抢票,协议抢票思路实现 一、获取Authorization凭证二、几个关键的参数三、几个关键的接口获取参数v,这个参数其实可以写死,可忽略通过价位获取演出的参数信息获取观演人信息,账号提前录入即可提交订单接口 先看实现图&a…

并发专题(7)之JUC并发工具源码分析

一、CountdownLatch源码分析 1.1 CountdownLatch应用 CountDownLatch本身就好像一个计数器,可以让一个线程或多个线程等待其他线程完成后再执行。 public static void main(String[] args) throws InterruptedException, BrokenBarrierException {// 声明CountDow…

SQL进阶技巧:如何寻找同一批用户 | 断点分组应用【最新面试题】

目录 0 问题描述 1 数据准备 2 问题分析 ​编辑 3 小结 0 问题描述 用户登录时间不超过10分钟的视为同一批用户,找出以下用户哪些属于同一批用户(SQL实现) 例如: user_name time a 2024-10-01 09:55 b 2024-10-01 09:57 c 2024-10-01…

分页查询日期格式不对

方式一:在属性上加入注解,对日期进行格式化 方式二:在 WebMvcConfiguration 中扩展Spring MVC的消息转换器,统一对日期类型进行格式化处理 /*** 统一转换处理扩展spring mvc* 后端返回前端的进行统一转化处理* param converters*/Overrideprotected voi…

redis的应用--分布式锁

redis的应用--分布式锁 一、分布式锁的概念二、分布式锁的基础实现2.1初步实现2.2引入过期时间2.3引入校验id2.4引入lua脚本2.5引入watch dog(看门狗)2.6引入Redlock算法 三、分布式锁的种类 一、分布式锁的概念 在⼀个分布式的系统中, 也会涉及到多个节…

构网型与跟网型混合直驱风电场并网稳定域研究

传统的风机变流器控制采用跟网型(grid-following,GFL)控制,需依赖于锁相环跟踪电网电压的频率/相位信息,以实现与电网的同步。随着能源电力系统的转型,电网逐渐转变为呈现低短路比(short-circuitratio,SCR&…

异步处理优化:多线程线程池与消息队列的选择与应用

目录 一、异步处理方式引入 (一)异步业务识别 (二)明确异步处理方式 二、多线程线程池(Thread Pool) (一)工作原理 (二)直面优缺点和适用场景 1.需要快…

3DMAX星空图像生成器插件使用方法详解

3DMAX星空图像生成器插件,一键生成星空或夜空的二维图像。它可用于创建天空盒子或空间场景,或作为2D艺术的天空背景。 【主要特点】 -单击即可创建星空图像或夜空。 -星数、亮度、大小、形状等参数。 -支持任何图像大小(方形)。…

eltable el-table 横向 滚动条常显

又遇到了难受的问题,el-table嵌入在一个div里面,结果因为内容太多,横向、纵向我都得滚动查看! 结果发现横向滚动时只能让它纵向触底后才能进行横向操作,这就很变态,明显不符合用户操作习惯。如下图: 要先纵…

《C++ Primer Plus》学习笔记|第8章 函数探幽 (24-11-30更新)

文章目录 8.1 内联函数8.2 引用变量8.2.1 创建引用变量8.2.2 将引用用作函数参数8.2.3 引用的属性和特别之处特点1:在计算过程中,传入的形参的值也被改变了。特点2:使用引用的函数参数只接受变量,而不接受变量与数值的运算左值引用…

在 Mac ARM 架构(例如 M1 或 M2 芯片)上安装 Node.js

文章目录 方法一:使用 Homebrew 安装 Node.js方法二:使用 Node Version Manager (NVM) 安装 Node.js方法三:从 Node.js 官方网站下载安装包注意事项 在 Mac ARM 架构(例如 M1 或 M2 芯片)上安装 Node.js 可以通过几种不…

电脑提示报错“Directx error”怎么解决?是什么原因导致的?游戏软件提示“Directx error”错误的解决方案

DirectX Error(DX错误)通常指的是在使用基于DirectX技术的应用程序(尤其是游戏)时遇到的问题。这个问题可能由多种因素导致,以下是一些可能的原因及相应的解决方案: 可能的原因 DirectX版本不匹配&#x…

JAVA:Spring Boot 3 实现 Gzip 压缩优化的技术指南

1、简述 随着 Web 应用的用户量和数据量增加,网络带宽和页面加载速度逐渐成为瓶颈。为了减少数据传输量,提高用户体验,我们可以使用 Gzip 压缩 HTTP 响应。本文将介绍如何在 Spring Boot 3 中实现 Gzip 压缩优化。 2、配置 Spring Boot 3 对…