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日

相关文章

  • 图解苹果笔记本电脑IP地址配置的过程

    图解苹果笔记本电脑IP地址配置的过程 苹果笔记本电脑的IP地址配置过程可以通过以下步骤进行。在这个过程中,我们将使用两个示例来说明。 步骤1:打开网络设置 首先,打开苹果笔记本电脑的“系统偏好设置”。你可以通过点击屏幕左上角的苹果图标,然后选择“系统偏好设置”来打开。 步骤2:选择网络 在系统偏好设置窗口中,找到并点击“网络”选项。这将打开网络设置界面。 步…

    other 2023年7月30日
    00
  • GDB:从单线程调试到多线程调试(MFiX单步调试)

    GDB: 从单线程调试到多线程调试 (MFiX 单步调试) 引言 在软件开发中,调试是必不可少的一环,本文将重点介绍通过 GDB 进行调试的过程。我们将以 MFiX(一款开源多相流计算软件)为例介绍单线程到多线程调试的过程。 一、单线程调试 单线程调试是指在程序的单个执行线程中进行调试。在 MFiX 应用程序的单线程模式下进行调试,具体操作如下: 编译 MF…

    其他 2023年3月28日
    00
  • 解决Cent0S 6.7直接在/etc/resolv.conf文件下修改DNS地址重启不生效问题

    当我们在CentOS 6.7上修改/etc/resolv.conf文件中的DNS地址后,发现重启网络服务或者服务器后DNS地址未能生效。这通常是因为CentOS 6.7中使用NetworkManager管理网络配置,而不是直接通过/etc/resolv.conf文件来设置DNS地址。下面是解决该问题的完整攻略。 步骤一:禁用NetworkManager 首先…

    other 2023年6月27日
    00
  • 在SQL中对同一个字段不同值,进行数据统计操作

    在SQL中对同一个字段不同值进行数据统计操作,可以使用GROUP BY子句,其语法如下: SELECT column_name, COUNT(*) FROM table_name GROUP BY column_name; 其中,column_name是需要进行分组统计的字段名,table_name为需要进行统计操作的表名。COUNT(*)表示对分组后的结果…

    other 2023年6月25日
    00
  • c++——引用reference

    以下是关于“C++ 引用(reference)”的完整攻略: 什么是引用(reference)? 引用是C++中的一种数据类型,它提供了一种简单的方法来访问其他变量的值。引用是一个别名,它指向另一个变量的地址,可以用来修改该变量的值。 引用的语法 引用的语法如下: type &ref = var; 其中,type是变量的类型,ref是引用的名称,va…

    other 2023年5月6日
    00
  • windows操作系统详解

    Windows操作系统详解 Windows操作系统是一款由微软公司开发的操作系统,目前广泛应用于个人电脑、服务器、移动设备等领域。本攻略主要介绍Windows操作系统的基本概念、应用场景以及使用方法等方面。 基本概念 Windows操作系统是一款基于GUI(图形用户界面)的操作系统。其特点是用户友好、易于使用。它支持多任务处理、多用户操作和网络连接等特性。W…

    其他 2023年4月16日
    00
  • 假设检验(hypothesistesting)

    假设检验(hypothesis testing) 在统计学中,假设检验(hypothesis testing)是一种用来检验、评估某个假设是否成立的方法。在假设检验中,我们会建立一个零假设(null hypothesis),然后寻找足够的证据来判断是否需要拒绝这个假设。 零假设(null hypothesis)和备择假设(alternative hypoth…

    其他 2023年3月28日
    00
  • visualstudio字母怎么切换大小写? vs大写字母转换为小写的教程

    在Visual Studio中,你可以使用快捷键来切换字母的大小写。下面是一些常用的方法: 使用快捷键:你可以使用以下快捷键来切换选定文本的大小写: 将选定文本转换为大写:Ctrl + Shift + U 将选定文本转换为小写:Ctrl + U 使用上下文菜单:你也可以使用上下文菜单来切换字母的大小写。只需右键单击选定的文本,然后选择“转换为大写”或“转换为…

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