python算法题 链表反转详解

Python算法题-链表反转详解

1. 题目描述

给定一个单链表,将其翻转。例如:

输入: 1 -> 2 -> 3 -> 4 -> None

输出: 4 -> 3 -> 2 -> 1 -> None

2. 解法分析

链表是一种动态数据结构,它不要求内存必须按照线性顺序连续分布,相对于数组来说,它更加灵活。

链表的每一个元素都有一个指向下一个元素的指针,也就是所谓的"next"指针。当一条链表反转时,每个元素的next指针都指向上一个元素,最后一个元素的next指针为空。

例如给定一个链表 1 -> 2 -> 3 -> 4 -> None,反转操作后应该变成 4 -> 3 -> 2 -> 1 -> None。

3. 代码实现

下面是Python3的代码实现:

# Definition for singly-linked list.
class ListNode:
    def __init__(self, val=0, next=None):
        self.val = val
        self.next = next

class Solution:
    def reverseList(self, head: ListNode) -> ListNode:
        pre = None
        cur = head
        while cur is not None:
            tmp = cur.next
            cur.next = pre
            pre = cur
            cur = tmp
        return pre

以上代码中,我们需要定义一个ListNode类,表示我们要翻转的链表。翻转的算法思路使用了三个指针,分别是precurtmp

假设当前的指针为cur,那么下一个节点为cur.next。我们需要保存上一个节点,用pre表示。将当前节点的next指向保存的上一个节点pre,然后将指针后移。重复进行以上操作,直到将链表翻转为止。

4. 示例说明

示例1:

我们先创建一个链表1 -> 2 -> 3 -> 4 -> None,然后将其打印出来看一下:

if __name__ == '__main__':
    l1 = ListNode(1)
    l2 = ListNode(2)
    l3 = ListNode(3)
    l4 = ListNode(4)
    l1.next = l2
    l2.next = l3
    l3.next = l4
    l4.next = None

    s = Solution()
    head = s.reverseList(l1)
    while head:
        print(head.val, end='->')
        head = head.next

输出结果为4 -> 3 -> 2 -> 1 -> None,符合我们的预期。

示例2:

我们再创建一个链表5 -> 6 -> None,然后将其打印出来看一下:

if __name__ == '__main__':
    l5 = ListNode(5)
    l6 = ListNode(6)
    l5.next = l6
    l6.next = None

    s = Solution()
    head = s.reverseList(l5)
    while head:
        print(head.val, end='->')
        head = head.next

输出结果为6 -> 5 -> None,同样符合我们的预期。

5. 总结

本文讲解了链表的反转操作,属于经典的算法题目,需要掌握链表的基本操作以及指针的使用技巧。在实际工作、学习中,链表操作也是非常常见的数据结构。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python算法题 链表反转详解 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • vs提示无法连接到已配置的开发web服务器的解决方法

    以下是“VS提示无法连接到已配置的开发web服务器的解决方法”的完整攻略: 什么是“VS提示无法连接到已配置的开发web服务器”? 当使用Visual Studio进行Web开发时,时会遇到“无法连接到已配置的开发Web服务器”的错误提示。这通常是由于配置错误或网络问题导致的。 步骤1:检查Web服务器配置 首先,检查Web服务器配置是否正确。确保已正确配置…

    other 2023年5月6日
    00
  • 深入探讨C语言中局部变量与全局变量在内存中的存放位置

    深入探讨C语言中局部变量与全局变量在内存中的存放位置 在C语言中,局部变量和全局变量在内存中的存放位置是不同的。了解它们在内存中的存放位置对于理解变量的作用域和生命周期非常重要。 局部变量的存放位置 局部变量是在函数内部声明的变量,它们的作用域仅限于声明它们的函数。局部变量在函数调用时被创建,在函数返回时被销毁。它们的存放位置通常是在栈(stack)上。 栈…

    other 2023年7月29日
    00
  • Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法

    Android开发使用Activity嵌套多个Fragment实现横竖屏切换功能的方法攻略 在Android开发中,使用Activity嵌套多个Fragment可以实现横竖屏切换功能。下面是一个详细的攻略,包含两个示例说明。 步骤一:创建Activity和Fragment 首先,创建一个包含多个Fragment的Activity。在res/layout目录下…

    other 2023年7月28日
    00
  • linux一些基本命令以及初级网络配置方法

    Linux基本命令 目录和文件命令 cd:进入到指定目录,用法:cd 目录路径 ls:列出当前目录下的所有文件和目录,用法:ls mkdir:创建一个新目录,用法:mkdir 目录名 touch:创建一个新文件,用法:touch 文件名 rm:删除一个文件或目录,用法:rm 文件名 或 rm -r 目录 文件编辑命令 vi:用于编辑文本文件,常用的命令有: …

    other 2023年6月26日
    00
  • 在CentOS系统上安装Java的openjdk的方法

    在CentOS系统上安装Java的OpenJDK的方法 以下是在CentOS系统上安装Java的OpenJDK的详细攻略: 更新系统软件包列表 在安装Java之前,首先需要更新系统的软件包列表。打开终端,并以root用户身份执行以下命令: yum update 安装OpenJDK 在CentOS系统上,可以使用yum包管理器来安装OpenJDK。执行以下命令…

    other 2023年10月13日
    00
  • ubuntu安装python3.8及新特性

    Ubuntu安装Python3.8及新特性 Python3.8是Python编程语言的最新版本,其中添加了很多新的特性和改进。如果你是Ubuntu用户,并且想要尝试使用Python3.8,那么本文将会教你如何在Ubuntu上安装Python3.8并了解一些新特性。 安装Python3.8 Python3.8可以通过apt-get命令进行安装。先更新源信息,再…

    其他 2023年3月28日
    00
  • MYSQL使用正则表达式过滤数据

    MYSQL使用正则表达式过滤数据攻略 1. 问题描述 在MYSQL中,我们经常需要根据特定的模式或规则来过滤数据。正则表达式是一种强大的工具,可以帮助我们实现灵活的数据过滤。 2. 解决方法 为了使用正则表达式过滤数据,可以采取以下方法: 方法1:使用REGEXP关键字 使用REGEXP关键字可以在WHERE子句中使用正则表达式进行数据过滤。以下是一个示例:…

    other 2023年10月18日
    00
  • 浅谈beego默认处理静态文件性能低下的问题

    背景介绍 beego是一个快速开发Go应用的框架,它提供了许多便捷的功能,如session、ORM等。但是,在默认情况下,beego对静态文件的处理会导致性能下降,这对网站的访问速度和用户体验都有一定的影响。本文将介绍beego默认处理静态文件性能低下的原因,并提供改进方案。 原因分析 在beego框架中,默认的处理静态文件的方式是通过在路由中增加静态文件的…

    other 2023年6月27日
    00
合作推广
合作推广
分享本页
返回顶部