python如何实现单向链表及单向链表的反转

下面我将详细讲解如何使用Python实现单向链表及单向链表的反转。

单向链表

单向链表是一种常见的线性数据结构,它由一个个节点组成,每个节点包含一个数据元素和一个指向后继节点的指针。单向链表的头节点通常不包含任何数据信息,只是一个辅助节点,指向第一个真正包含数据信息的节点。

实现方法

我们可以使用Python中的类来实现单向链表。类中定义一个Node类表示每个节点,每个节点包含一个数据元素和一个指向后继节点的指针。在类中定义链表的一些基本操作,如插入、删除和搜索等。

class Node:
    def __init__(self, data):
        self.data = data
        self.next = None

class LinkedList:
    def __init__(self):
        self.head = Node(None)

    # 插入
    def insert(self, data):
        new_node = Node(data)
        current_node = self.head
        while current_node.next:
            current_node = current_node.next
        current_node.next = new_node

    # 删除
    def delete(self, data):
        current_node = self.head
        while current_node.next:
            if current_node.next.data == data:
                current_node.next = current_node.next.next
                return
            current_node = current_node.next
        print("Not found!")

    # 搜索
    def search(self, data):
        current_node = self.head
        while current_node.next:
            current_node = current_node.next
            if current_node.data == data:
                return current_node
        return None

    # 输出链表
    def __str__(self):
        current_node = self.head
        res = ''
        while current_node.next:
            current_node = current_node.next
            res += str(current_node.data) + ' -> '
        return res + 'None'

示例说明

我们可以通过以下代码来测试我们实现的单向链表:

linked_list = LinkedList()
linked_list.insert(1)
linked_list.insert(2)
linked_list.insert(3)
linked_list.insert(4)

print(linked_list)  # 输出 1 -> 2 -> 3 -> 4 -> None

linked_list.delete(3)

print(linked_list)  # 输出 1 -> 2 -> 4 -> None

node = linked_list.search(2)

print(node.data)  # 输出 2

单向链表的反转

单向链表的反转是指将单向链表中的所有节点顺序颠倒过来,使得原本的尾节点变成新的链表头节点。单向链表的反转可以使用迭代或递归来实现。

实现方法

迭代法

我们可以通过循环遍历链表,每次将当前节点的指针指向前一个节点来实现链表的反转。需要注意的是,在反转链表的过程中,必须记录下前一个节点和当前节点。

class LinkedList:
    # ...

    # 链表反转
    def reverse(self):
        current_node = self.head.next
        prev_node = None
        while current_node:
            next_node = current_node.next
            current_node.next = prev_node
            prev_node = current_node
            current_node = next_node
        self.head.next = prev_node

递归法

递归法是将链表反转问题转化为该链表第二个节点开始往后的节点序列的反转问题,利用递归实现链表反转。

class LinkedList:
    # ...

    # 链表反转
    def reverse_recursive(self, node):
        if not node or not node.next:
            return node
        new_head = self.reverse_recursive(node.next)
        node.next.next = node
        node.next = None
        return new_head

示例说明

我们可以通过以下代码来测试我们实现的单向链表的反转:

linked_list = LinkedList()
linked_list.insert(1)
linked_list.insert(2)
linked_list.insert(3)

linked_list.reverse()

print(linked_list)  # 输出 3 -> 2 -> 1 -> None

linked_list_reverse = LinkedList()
linked_list_reverse.insert(1)
linked_list_reverse.insert(2)
linked_list_reverse.insert(3)

new_head = linked_list_reverse.reverse_recursive(linked_list_reverse.head.next)

linked_list_reverse.head.next = new_head

print(linked_list_reverse)  # 输出 3 -> 2 -> 1 -> None

以上就是实现单向链表及单向链表反转的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python如何实现单向链表及单向链表的反转 - Python技术站

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

相关文章

  • 国产操作系统有哪些?

    国产操作系统是指由中国企业或机构自主研发的操作系统。目前市场上已经有了多款国产操作系统,包括麒麟操作系统、中标麒麟操作系统、红旗Linux、联想StartOS等。以下是针对该话题的完整攻略: 国产操作系统有哪些? 麒麟操作系统 麒麟操作系统是华为推出的一款操作系统,主要应用于华为的智能手机、笔记本电脑、平板电脑等设备上。麒麟操作系统基于Android平台研发…

    其他 2023年4月16日
    00
  • PHP 第三节 变量介绍

    PHP 第三节 变量介绍 在本节中,我们将详细介绍PHP中的变量。变量是用于存储和操作数据的容器。在PHP中,变量使用一个美元符号($)后跟变量名来声明和使用。 变量声明和赋值 要声明一个变量,只需使用美元符号($)后跟一个有效的变量名。变量名必须以字母或下划线开头,后面可以是字母、数字或下划线的组合。以下是一个示例: $age = 25; 在上面的示例中,…

    other 2023年8月8日
    00
  • cad怎么转换成pdf

    下面是将 CAD 转换为 PDF 的完整攻略。 步骤一:选择合适的 CAD 软件 首先,您需要有一款能够打开您的 CAD 文件并将其转换为 PDF 格式的 CAD 软件。常用的 CAD 软件包括 AutoCAD、SolidWorks、SketchUp、CADintosh 等。其中,AutoCAD 是功能最强大的 CAD 软件之一,但价格较为昂贵,如果您只需要…

    其他 2023年4月16日
    00
  • PHP学习笔记(二):变量详解

    PHP学习笔记(二):变量详解 在这篇学习笔记中,我们将深入了解PHP中的变量。变量是存储数据的容器,可以在程序中使用和操作。我们将学习如何声明变量、给变量赋值、以及如何使用变量进行计算和输出。 声明变量 在PHP中,可以使用$符号来声明一个变量。变量名由字母、数字和下划线组成,且不能以数字开头。以下是一个声明变量的示例: $name = \"Jo…

    other 2023年8月8日
    00
  • 在centos docker中安装nvidia驱动

    在CentOS Docker中安装NVIDIA驱动的完整攻略如下: 确认系统环境 在安装NVIDIA驱动之前,需要确认系统环境是否满足要求。首先,需要确认系统中是否已经安装了Docker和NVIDIA驱动所需的内核模块。可以通过以下命令来确认: $ uname -r 如果输出的内核版本号为3.10或以上,并且已经安装了Docker和NVIDIA驱动所需的内核…

    other 2023年5月5日
    00
  • mysql表名忽略大小写配置方法详解

    MySQL表名忽略大小写配置方法详解 在MySQL中,默认情况下,表名是区分大小写的。但是,有时候我们可能需要忽略表名的大小写,以便更方便地进行数据库操作。下面是配置MySQL表名忽略大小写的方法: 方法一:修改配置文件 打开MySQL的配置文件 my.cnf(或者 my.ini,具体文件名可能因操作系统而异)。 在文件中找到 [mysqld] 部分。 在 …

    other 2023年8月16日
    00
  • h5前端框架推荐合集

    以下是详细讲解“H5前端框架推荐合集的完整攻略”,过程中至少包含两条示例说明的标准Markdown格式文本: H5前端框架推荐合集 H5前端框架是一种用于构建Web应用程序的工具集,可以帮助开发人员快速构建质量的Web应用程序。本文将介绍几种常用的H5前端框架,包括Bootstrap、Foundation、Semantic UI等。 Bootstrap Bo…

    other 2023年5月10日
    00
  • 360路由器c301最新固件支持万能中继

    360路由器C301最新固件支持万能中继的完整攻略 360路由器C301是一款性价比较高的路由器,最新固件版本支持万能中继功能,可以帮助用户扩大无线覆盖范围。本文将为您详细讲解360路由器C301最新固件支持万能中继的完整攻略,包括固件升级、中继设置等内容。 固件升级 在使用万能中继功能之前,需要先升级路由器的固件版本。以下是升级360路由器C301固件的步…

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