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日

相关文章

  • 详解Android TabHost的多种实现方法 附源码下载

    详解Android TabHost的多种实现方法 附源码下载 简介 Android TabHost是一个用于实现选项卡界面的控件,可以在一个界面中显示多个选项卡,并通过切换选项卡来显示不同的内容。本攻略将详细介绍Android TabHost的多种实现方法,并提供源码下载。 方法一:使用TabHost和TabWidget 首先,在XML布局文件中定义TabH…

    other 2023年9月7日
    00
  • 详解Laravel框架的依赖注入功能

    我会详细讲解“详解Laravel框架的依赖注入功能”的完整攻略: 什么是依赖注入 在编写面向对象程序时,类之间通常存在着各种各样的关联关系,常见的包括依赖关系、聚合关系和组合关系等等。而这些关系都可以用一个术语来统称——依赖。 依赖注入(Dependency Injection)是一种实现类之间松耦合关联的方式。其核心思想是:通过构造器、接口或者setter…

    other 2023年6月26日
    00
  • win10预览版9926官方ISO镜像下载 win10预览版ISO镜像下载地址大全

    Win10预览版9926官方ISO镜像下载攻略 Win10预览版9926是Windows 10操作系统的一个早期版本,本攻略将详细介绍如何下载官方ISO镜像以及提供一些常用的下载地址。 步骤一:访问官方网站 首先,我们需要访问微软官方网站以获取Win10预览版9926的官方ISO镜像。请按照以下步骤进行操作: 打开你的网络浏览器,访问微软官方网站(https…

    other 2023年8月4日
    00
  • Redis配置文件详解

    当在Linux服务器上安装Redis之后,就需要为Redis配置文件进行一些必要的修改,以便让Redis按照我们需要的方式来运行。本篇文章将详细讲解Redis配置文件的各种参数及其作用。 Redis配置文件的路径 Redis配置文件默认存储在Redis的安装目录下,文件名为redis.conf,可以通过以下命令查找: $ find / -name redis…

    other 2023年6月25日
    00
  • ubuntu怎么开启root帐号 ubuntu 开启root帐号方法图解

    Ubuntu怎么开启root帐号 在Ubuntu操作系统中,默认情况下是不开启root帐号的。但是,在某些情况下,您可能需要使用root帐号来执行一些高级操作。这篇攻略将会详细介绍如何开启Ubuntu的root帐号,并提供相应的示例说明。 步骤一:使用sudo命令 首先,我们需要明确一点,即Ubuntu操作系统并不推荐使用root帐号,而是使用sudo命令来…

    other 2023年6月27日
    00
  • combobox数据获取及使用总结

    combobox数据获取及使用总结 combobox 是用来展示可选项的控件,通常用在表单中,辅助用户选择。在 Web 开发中,我们经常需要通过 ajax 异步获取 combobox 所需的数据,或者前端通过静态数据生成 combobox。本文将总结 combobox 的数据获取方式,并讨论如何在不同场景下使用 combobox。 数据获取 静态数据生成 c…

    其他 2023年3月28日
    00
  • 自己搭建cdn服务器赚钱

    以下是详细的步骤和示例: 步骤1:选择CDN 首先,您需要选择一个CDN服务器。您可以选择一些知名的CDN服务提供商,如阿里云腾讯云、百度云等,也可以选择一些开源的CDN服务器,如Nginx、Varnish等。 步骤2:搭建CDN服务器 以下是使用Nginx搭建CDN服务器的示例 示例1:安装Nginx 首先,您需要安装Nginx。您可以使用以下命令在Ubu…

    other 2023年5月6日
    00
  • Python 多线程实例详解

    Python 多线程实例详解 一、什么是多线程? 多线程是指在同一进程内无同步阻塞的情况下,使用多个线程同时执行程序运行的方式。相对于串行化的单线程,多线程的程序可以充分利用 CPU 资源,提高程序的运行效率。在 Python 中,可以使用内置模块 threading 来实现多线程程序。 二、如何实现多线程? 可以使用 Python 内置的 threadin…

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