算法套路四——反转链表

算法套路四——反转链表

算法示例一:LeetCode206. 反转链表

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
初始化pre为空,cur为头指针

pre指针:记录当前结点的前一个结点
cur指针:记录当前结点,cur的next指针指向pre
nxt指针:记录当前结点的后一个结点,记录cur的next,防止断链
循环中左边按照ncpc的顺序反转,右边按照cpcn的顺序,且左右两边第一个c都为cur.next
在这里插入图片描述
反转结束后,从原来的链表上看:pre指向反转这一段的末尾,cur指向反转这一段后续的下一个节点

class Solution:
    def reverseList(self, head: Optional[ListNode]) -> Optional[ListNode]:
        pre = None
        cur = head
        while cur:
            nxt = cur.next
            cur.next = pre
            pre = cur
            cur = nxt
            #顺序为ncpc
        return pre

算法示例二:LeetCode92. 反转链表 II

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。
在这里插入图片描述

这题比前一题相比只是在中间进行反转,

  • 如果left=1,那么反转的逻辑与前一题一样,可以令pre = None,cur = head
  • 但若是left>1,我们在反转时不是从head开始,那么在反转后需要一个结点p0来记录反转的前一个结点,从而反转后可以连接到前面的结点

但分情况讨论在问题复杂时比较麻烦,所以我们可以用到反转链表时常用的哨兵dummy结点,它可以作为一个“假”的头结点,它的下一个结点指向真正的头结点head,这样的话就可以认为left无论是大于或是等于1,都可以用p0来记录反转前的结点

初始化后如图所示
pre指向null,p0指向反转前一个结点,
在这里插入图片描述

在反转结束后链表结构如下图所示:
在这里插入图片描述

因此直接令
p0.next.next=cur
p0.Next = pre
最后结果是
在这里插入图片描述
且最后返回dummy.next,不管head结点是否参与反转,dummy.next一定是指向反转后的链表头结点

func reverseBetween(head *ListNode, left int, right int) *ListNode {
    dummy := &ListNode{Val: 0, Next: head}
    p0:=dummy
    for i:=1;i<left;i++{
        p0=p0.Next
    }
    var pre,cur *ListNode = nil, p0.Next
    for i:=0;i<right-left+1;i++{
        nxt:=cur.Next
        cur.Next=pre
        pre=cur
        cur=nxt
    }
    p0.Next.Next = cur
    p0.Next = pre
    return dummy.Next
}

练习Leetcode25. K 个一组翻转链表

给你链表的头节点 head ,每 k 个节点一组进行翻转,请你返回修改后的链表。k 是一个正整数,它的值小于或等于链表的长度。如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。在这里插入图片描述

此题首先按照上一题的思路,在第一次反转后如图所示
在这里插入图片描述
之后进行下一次反转时如果按照上题的思路对p0进行移动 p0.Next.Next = cur p0.Next = pre,会得到如下图示

在这里插入图片描述
我们可以发现在进行转变后,对3,4进行反转时丢失了反转前一个节点,这样会导致之后的反转丢失前链,所以我们在转变之前需要一个变量pnext来记录p0.next,从而可以记录第二次反转的前一个结点指针,然后进行p0.Next.Next = cur、p0.Next = pre赋值后,再将pnext赋给p0
最后如上题一样返回dummy.next

func reverseKGroup(head *ListNode, k int) *ListNode {
    n:=0
    for node:=head;node!=nil;node=node.Next{
        n++
    }
    dummy := &ListNode{Val: 0, Next: head}
    var pre *ListNode=nil
    cur:=head
    p0:=dummy
    for ;n>=k;n-=k{
        for i:=0;i<k;i++{
            nxt:=cur.Next
            cur.Next=pre
            pre=cur
            cur=nxt
        }
        p0.Next.Next = cur
        pnext:=p0.Next//记录p0.Next,防止断链
        p0.Next = pre
        p0=pnext
    }
    return dummy.Next
}

练习LeetCode24. 两两交换链表中的节点

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot整合MongoDB

参考链接 https://www.mongodb.org.cn/ 文章目录一、前言1.1 NoSQL介绍1.1.1 NoSQL 数据库分类1.1.2 NoSQL的优点/缺点1.1.3 BASE1.2 MongoDB介绍1.2.1 MongoDB和SQL对比1.2.2 数据库1.2.3 元数据1.2.4 MongoDB 数据类型二、SpringBoot整合MongDB2.1 环境配置2.2 MongoTemplate…

XCPC第十一站,带你学会图论基本算法

我们约定&#xff1a;以下n表示点的数目&#xff0c;m表示边的数目。 引子1——邻接表存储图的方法&#xff08;&#xff09;&#xff08;暂时不考虑重边和自环&#xff09; 现在我们有n个点&#xff08;编号为1~n&#xff09;和m条边&#xff0c;要用数组存储它们&#xff0c…

大数据模型、离线架构、实时架构

一.大数据模型 8种常见的大数据分析模型&#xff1a;1、留存分析模型&#xff1b;2、漏斗分析模型&#xff1b;3、全行为路径分析&#xff1b;4、热图分析模型&#xff1b;5、事件分析模型&#xff1b;6、用户分群模型&#xff1b;7、用户分析模型&#xff1b;8、黏性分析模型…

10 个超赞的 C 语言开源项目

今天给大家分享10个超赞的C语言开源项目&#xff0c;希望这些内容能对大家有所帮助&#xff01;01.WebbenchWebbench是一个在 Linux 下使用的非常简单的网站压测工具。它使用fork()模拟多个客户端同时访问我们设定的URL&#xff0c;测试网站在压力下工作的性能。最多可以模拟 3…

Mysql 时区差8小时的多种问题 统统解决

笑小枫专属目录背景知识点代码中常见的三种时间差错问题【我遇到的】本地获取的时间没有错&#xff0c;存入数据库的时候时间相差8小时java下使用 new date()获取的时间会和真实的本地时间相差8小时数据库时间没有错&#xff0c;获取到了后端&#xff0c;之后返回给前端相差8小…

Android 不申请权限储存、删除相册图片

Android 不申请权限储存、删除相册图片 前言 最近重新看了下安卓的储存适配&#xff0c;并结合之前做的拍照、裁切demo&#xff0c;小小实验了一下。Android 6.0增加了动态文件权限申请; Android 7.0需要使用FileProvider来获取Uri&#xff0c;不能直接使用file获得; Android…

FPGA基于RIFFA实现PCIE采集HDMI传输,提供工程源码和QT上位机

目录1、前言2、RIFFA理论基础3、设计思路和架构4、vivado工程详解5、上板调试验证并演示6、福利&#xff1a;工程代码的获取1、前言 PCIE是目前速率很高的外部板卡与CPU通信的方案之一&#xff0c;广泛应用于电脑主板与外部板卡的通讯&#xff0c;PCIE协议极其复杂&#xff0c…

【CS224W】(task12)GAT GNN training tips

note GAT使用attention对线性转换后的节点进行加权求和&#xff1a;利用自身节点的特征向量分别和邻居节点的特征向量&#xff0c;进行内积计算score。异质图的消息传递和聚合&#xff1a;hv(l1)σ(∑r∈R∑u∈Nvr1cv,rWr(l)hu(l)W0(l)hv(l))\mathbf{h}_v^{(l1)}\sigma\left(\…

第十八天 Vue-前端工程化总结

目录 Vue-前端工程化 1. 前后端分离开发 1.1 介绍 1.2 Yapi 2. 前端工程化 2.1 环境准备 2.2 Vue项目简介 2.3 Vue项目开发流程 3. Vue组件库Element 3.1 快速入门 3.2 常用组件 3.3 案例 Vue-前端工程化 前面我们已经讲解了HTML、CSS、JavaScript以及Vue等知识。已…

【粉丝投稿】上海某大厂的面试题,岗位是测开(25K*16)

简单介绍一句&#xff0c;大专出身&#xff0c;三年经验。跳了四次槽&#xff0c;面试了无数次&#xff0c;现在把自己的面试经验整理出来分享给大家&#xff0c;堪称必杀技&#xff01; 1&#xff0c;一切从实际出发&#xff0c;对实际工作进行适当修饰 2&#xff0c;不会的简…

【进阶数据结构】平衡搜索二叉树 —— AVL树

&#x1f308;感谢阅读East-sunrise学习分享——[进阶数据结构]AVL树 博主水平有限&#xff0c;如有差错&#xff0c;欢迎斧正&#x1f64f;感谢有你 码字不易&#xff0c;若有收获&#xff0c;期待你的点赞关注&#x1f499;我们一起进步&#x1f680; &#x1f308;我们上一篇…

学习Linux只要学会这个命令就够了!

大家好&#xff0c;我是良许。 这段时间又是搬家&#xff0c;又是找新办公室&#xff0c;现在终于安顿下来了&#xff0c;有时间给大家分享干货了。 今天给大家介绍一个 Linux 超级实用命令&#xff0c;有了这个命令&#xff0c;你就可以愉快使用 Linux 上几乎所有常用命令了…

【Unity入门】3D物体

【Unity入门】3D物体 大家好&#xff0c;我是Lampard~~ 欢迎来到Unity入门系列博客&#xff0c;所学知识来自B站阿发老师~感谢 &#xff08;一&#xff09;物体移动旋转缩放 &#xff08;1&#xff09;物体移动 在上一篇文章【Unity入门】场景视图操作我们学会了在场景中创建3…

Java现在好找工作吗?

Java到2023年已经28岁了&#xff0c;可能你会怀疑它是否还一如当年一样的强大&#xff0c;在应用层领域独占鳌头。但是基于Java庞大的市场占有率和需求&#xff0c;它依然在保持着更新迭代&#xff0c;依然是最常用的底层开发语言&#xff0c;基于其安全性、开放性、稳定性和跨…

springboot Aspect切面

问题描述 配置切面&#xff0c;但未切到目标类上 切面类 Component Aspect public class ControllerAspect {//Pointcut("execution(* com.yzk.learn.springbootsecurity.controller.UserController.info(..))")Pointcut("execution(* com.learn..*.controlle…

类ChatGPT开源项目的部署与微调:从LLaMA到ChatGLM-6B

前言 近期&#xff0c;除了研究ChatGPT背后的各种技术细节 不断看论文(至少100篇&#xff0c;100篇目录见此&#xff1a;ChatGPT相关技术必读论文100篇)&#xff0c;还开始研究一系列开源模型(包括各自对应的模型架构、训练方法、训练数据、本地私有化部署、硬件配置要求、微调…

Java代码是如何被CPU狂飙起来的?

&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3;&#x1f4e3; &#x1f38d;大家好&#xff0c;我是慕枫 &#x1f38d;前阿里巴巴高级工程师&#xff0c;InfoQ签约作者、阿里云专家博主&#xff0c;一直致力于用大白话讲解技术知识 &#x…

安全防御之防火墙篇(二)

目录 1.防火墙如何处理双通道协议&#xff1f; 2.防火墙如何处理NAT&#xff1f; 3.防火墙支持哪些NAT技术&#xff0c;主要应用的场景是什么&#xff1f; 4.当内网PC通过公网域名解析访问内网服务器的时候&#xff0c;会存在什么问题&#xff0c;如何解决&#xff1f;请详细…

【MySQL】CentOS编译安装MySQL5.7实战

前言 这篇文章是关于MySQL编译安装的&#xff0c;重点掌握的是编译的过程&#xff0c;以及体会排错的痛苦。出错在所难免&#xff0c;最重要的是要有一颗不放弃的心。 本文收录于《数据库入门与精通》专栏, 本专栏写作的过程中&#xff0c;联合了csdn几位DBA大佬&#xff0c;…

SpringBoot整合Kafka(包含Kafka_2.12-3.3.1单节点安装,kafka可视化程序efak v3.0.1安装)

SpringBoot整合Kafka&#xff08;包含Kafka_2.12-3.3.1单节点安装&#xff0c;kafka可视化程序efka v3.0.1安装&#xff09;kafka、efak安装包下载kafka安装资源下载&#xff1a;下载tgz安装包&#xff1a;http://archive.apache.org/dist/kafka/ //解压 tar -zxvf /home/soft/…