leetcode链表之反转链表

2023-11-07

本文主要有三道题,都是关于反转链表的算法题,由浅入深。
文章出现的代码都是python3

206、反转链表
题目

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

示例1:

输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]

示例2:

输入:head = [1,2]
输出:[2,1]

示例3:

输入:head = []
输出:[]

思路

记录当前结点和上一个结点,然后将当前结点的指针指向上一个结点

代码:

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        prev, cur = None, head
        while cur:
          	# 存储当前结点的下一个结点,避免结点丢失
            next = cur.next
            # 将当前结点的指针反转指向上一个结点
            cur.next = prev
            # 将prev移动到cur,并将cur移动到下一个结点,进行下一次循环
            prev = cur
            cur = next
        return prev
92、反转链表2
题目

给你单链表的头指针 head 和两个整数 left 和 right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例1:

输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]

示例2:

输入:head = [5], left = 1, right = 1
输出:[5]

思路

查找到左右两个结点,单独对这两个结点之间的链表进行反转,将翻转后的结果拼接到原来的链表中。

需要注意保留左节点的前一个结点,用于左节点的拼接

代码:

class Solution:
  	# 反转头结点到尾结点之间的链表,并返回新的头结点和尾结点
    def reversed(self, head, tail):
        prev, cur = None, head
        t = head
        while cur:
            next = cur.next
            cur.next = prev
            prev = cur
            if cur == tail: break
            cur = next
        return prev, t

    def reverseBetween(self, head: ListNode, left: int, right: int) -> ListNode:
        if not head or not head.next: return head
        vHead = ListNode(0, head)
        cur = vHead
        # 移动left-1的距离,到达左结点的前一个结点,用于左链表的拼接
        for i in range(left - 1):
            cur = cur.next
        preLeft = cur
        # 由于是从左节点的前一个结点进行遍历,所以右节点的遍历需要+1
        for i in range(right - left + 1):
            cur = cur.next
        rightNode = cur
        nextRight = rightNode.next
        # 进行左右结点链表反转
        bHead, bTail = self.reversed(preLeft.next, rightNode)
        # 进行链表的拼接
        preLeft.next = bHead
        bTail.next = nextRight
        return vHead.next
25、K个一组翻转链表
题目

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

示例1:

输入:head = [1,2,3,4,5], k = 2
输出:[2,1,4,3,5]

示例2:

输入:head = [1,2,3,4,5], k = 3
输出:[3,2,1,4,5]

示例3:

输入:head = [1,2,3,4,5], k = 1
输出:[1,2,3,4,5]

示例4:

输入:head = [1], k = 1
输出:[1]

思路

这个问题主要有两个点,1个是k个结点,2是进行翻转

k个结点可以使用快慢结点来解决

class Solution:
		# 翻转链表,
    # 1、先将next结点保存起来,更改当前结点的指向,即将当前结点指向前一个结点
    # 2、然后向后移动结点
    # 需要考虑边界值,当翻转过后,判断当前结点是不是已经到尾部了,此时可以结束循环
    def reversed(self, head, tail):
        prev, cur = None, head
        t = head
        while cur:
            next = cur.next
            cur.next = prev
            prev = cur
            if cur == tail: break
            cur = next
        return prev, t

    def reverseKGroup(self, head: Optional[ListNode], k: int) -> Optional[ListNode]:
        if not head or k == 1: return head
        vHead = ListNode(0, head)
        cur = vHead
        fast = head
        while fast:
          	# 快结点每次先移动k个距离,如果距离不够,则直接返回即可
            for i in range(k-1):
                fast = fast.next
                if not fast: return vHead.next
            # 此时要保存一下快结点的下一个结点,避免链表结点信息丢失
            fnext = fast.next
            prev, tail = self.reversed(cur.next, fast)
            # 将翻转之后的头结点拼接起来
            cur.next = prev
            tail.next = fnext
						# 将当前结点移动至翻转后的尾结点处,快指针移到下一个结点,进行下一次循环
            cur = tail
            fast = fnext
        return vHead.next
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

leetcode链表之反转链表 的相关文章

随机推荐

  • JS手写实现发布订阅设计模式

    大部分前端应该对设计模式了解都不多 但是对Vue理解深刻的同学一定都知道发布订阅模式 因为Vue2的响应式就是基于Object defineProperty 发布订阅模式实现的 今天我们就用JS简单实现一下发布订阅模式 观察者 watche
  • LeetCode刷题日记2021-12-7/1034. 边界着色-DFS深度优先搜素

    1034 边界着色 DFS深度优先搜素 题目描述 题解思路 题解代码 题目描述 给你一个大小为 m x n 的整数矩阵 grid 表示一个网格 另给你三个整数 row col 和 color 网格中的每个值表示该位置处的网格块的颜色 当两个
  • 详解Hugging Face Transformers的TrainingArguments

    前言 TrainingArguments是Hugging Face Transformers库中用于训练模型时需要用到的一组参数 用于控制训练的流程和效果 使用示例 from transformers import Trainer Trai
  • 神武3进不去 服务器响应,windows7系统玩神武2卡机的解决方法

    神武2是一款备受玩家们喜欢的游戏之一 不过有部分windows7系统用户在玩神武2游戏的时候 发现遇到了卡机的情况 一卡一卡非常不流畅 影响了正常游戏 要如何解决呢 本教程就给大家带来windows7系统玩神武2卡机的解决方法 1 可能导致
  • ZCA白化的步骤

    ZCA白化的主要用于去相关性 尽量使白化后的数据接近原始输入数据 对于含有m个样本的数据集 x 1 x 2 x m 假设每个样本的维度为n 即x i R n 对其进行ZCA白化的具体步骤如下 1 计算数据集的协方差矩阵 计算公式如下 1 m
  • Java 程序如何正确地打印日志?

    在 Java 开发中 打印日志是一项非常重要的工作 正确的打印日志可以帮助我们快速定位问题 并提高代码的可维护性和可读性 本文将为大家介绍 Java 程序如何正确地打日志 希望对大家有所帮助 一 为什么需要打印日志 在开发过程中 我们经常需
  • 仓库运行状况如何得知?数据挖掘是关键!

    库存 订单 出入库记录 物流信息 货物状态等数据 是仓库管理的重要组成部分 仓库数据的重要性 做好仓库数据管理对企业的重要性不言而喻 通过有效地管理数据 企业可以更好地了解市场需求和库存情况 快速响应市场变化 提高库存周转率和客户满意度 此
  • 阿里云centos7.9安装docker,创建nginx容器,启动vue3项目

    1 安装必要的依赖包 sudo yum install y yum utils device mapper persistent data lvm2 2 添加Docker存储库 sudo yum config manager add rep
  • 实现快速排序(数据结构与算法 - 排序)

    通过补全快速排序私有函数QSort 来供函数QuickSort调用 以此来实现快速排序的功能 相关知识 快速排序的基本过程是 从待排序记录中任选一个记录 以它的排序码作为中心值 将其它记录划分为两个部分 第一部分包含所有排序码小于等于中心值
  • 【TensorFlow】tf.reset_default_graph()函数

    如下是官网对tf reset default graph 函数描述的翻译 tf reset default graph函数用于清除默认图形堆栈并重置全局默认图形 注意 默认图形是当前线程的一个属性 该tf reset default gra
  • postman的参数是图片和文件如何设置,及操作提示this file is not in your working directory

    1 图片或者文件 作为参数的设置 在参数这里 选择文件 选择需要作为参数的文件 2 提示this file is not in your working directory 提示这个文件不在你的工作路劲下 设置一下当前的工作路径即可
  • 用sql语句对数据库表中的数据进行增删改

    如何使用sql语句对mysql数据库中表的数据进行增删改 这里新创了一个school数据库 在下面创建一张名为student表 创建student表的sql语句代码如下 使用school数据库 use school 判断是否存在studen
  • 手把手教你用 NebulaGraph AI 全家桶跑图算法

    前段时间 NebulaGraph 3 5 0 发布 whitewum 吴老师建议我把前段时间 NebulaGraph 社区里开启的新项目 ng ai 公开给大家 所以 就有了这个系列文章 本文是该系列的开篇之作 ng ai 是什么 ng a
  • Java中Scanner类中next与nextLine的区别

    1 next的意思是接受文字 有效文字 next不接收空格回车以及Tab 当你输入空格回车Tab的时候接收就会终止 并不会存入到String 变量中去 特别的情况 当在输入的时候先输入了几个空格然后再输入String中内容得时候String
  • C++ 程序文档生成器介绍(doxygen)

    http ly4cn cnblogs com archive 2005 11 23 282637 html 程序文档 曾经是程序员的一个头痛问题 写一个程序文档 比较花时间 但不是很难 麻烦的是当程序修改后 程序文档也要跟着同步更新 否则文
  • Python 练习实例11:兔子的规律为数列1,1,2,3,5,8,13,21

    古典问题 有一对兔子 从出生后第3个月起每个月都生一对兔子 小兔子长到第三个月后每个月又生一对兔子 假如兔子都不死 问每个月的兔子总数为多少 程序分析 兔子的规律为数列1 1 2 3 5 8 13 21 程序代码 def f n if n
  • 傅里叶变换、短时傅里叶变换、小波变换

    顺序 傅里叶 gt 短时傅里叶变换 gt 小波变换的顺序 转载自形象易懂的傅里叶变换 短时傅里叶变换和小波变换本文作者按照傅里叶 短时傅里叶变换 小波变换的顺序 由浅到深的解释小波变换的缘由以及思路 https mp weixin qq c
  • VMware中安装Kali一步解决(7z格式)

    VMware中安装Kali一步解决 7z格式 首先搜索Kali 进入官网找到VMware版本 选择第一个就好了 进去之后 根据自己的电脑选择就好 有64位和32位 点击torrent会生成种子 下载好种子之后 使用迅雷下载就好了 下载完成之
  • 十一.linux多线程同步之互斥锁、信号量、条件量

    笔记 https note youdao com ynoteshare1 index html id 1b529d966d34b16f3bdd828be48364e4 type note 目录 一 线程同步之信号量 1 任务 用户从终端输入
  • leetcode链表之反转链表

    本文主要有三道题 都是关于反转链表的算法题 由浅入深 文章出现的代码都是python3 206 反转链表 题目 给你单链表的头节点 head 请你反转链表 并返回反转后的链表 示例1 输入 head 1 2 3 4 5 输出 5 4 3 2