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日

相关文章

  • Win10/Win8.1 Modern版QQ4.9获更新下载:小幅优化升级

    Win10/Win8.1 Modern版QQ4.9获更新下载:小幅优化升级攻略 简介 本攻略将详细介绍如何更新下载Win10/Win8.1 Modern版QQ4.9,并提供两个示例说明。 步骤 打开浏览器,进入QQ官方网站。 在官方网站的首页或下载页面,找到Win10/Win8.1 Modern版QQ4.9的下载链接,并点击进入下载页面。 在下载页面,选择适…

    other 2023年8月2日
    00
  • 兔兔助手Cydia一键安装工具已经发布 使用方法及下载地址

    兔兔助手Cydia一键安装工具攻略 简介 兔兔助手Cydia一键安装工具是一款方便快捷的工具,用于在iOS设备上安装Cydia。本攻略将详细介绍该工具的使用方法及下载地址。 下载地址 你可以从以下地址下载兔兔助手Cydia一键安装工具:下载地址 使用方法 下载并安装兔兔助手Cydia一键安装工具。 打开兔兔助手Cydia一键安装工具应用程序。 连接你的iOS…

    other 2023年8月5日
    00
  • Android实现手势滑动多点触摸缩放平移图片效果(二)

    Android实现手势滑动多点触摸缩放平移图片效果(二)攻略 本攻略将详细介绍如何在Android应用中实现手势滑动、多点触摸、缩放和平移图片的效果。以下是完整的攻略步骤: 步骤一:准备工作 在开始之前,确保你已经创建了一个Android项目,并且已经添加了一个ImageView用于显示图片。 步骤二:导入依赖库 在项目的build.gradle文件中,添加…

    other 2023年8月21日
    00
  • React中DOM事件和状态介绍

    React中DOM事件和状态介绍攻略 React是一个流行的JavaScript库,用于构建用户界面。在React中,DOM事件和状态是两个重要的概念。本攻略将详细介绍React中的DOM事件和状态,并提供两个示例说明。 DOM事件 在React中,DOM事件是与用户交互相关的操作,例如点击、鼠标移动等。React通过使用事件处理函数来处理DOM事件。以下是…

    other 2023年8月21日
    00
  • mongodb(实现join)

    以下是关于“MongoDB(实现JOIN)”的完整攻略: MongoDB简介 MongoDB是一个开源的文档型数据库,使用JSON格式存储,支持动态查询和索引MongoDB的特点是高性能、高可用性、易扩展、灵活性高等。 MongoDB的JOIN MongoDB不支持传统SQL JOIN操作,但是可以通过一些技巧来实现类似的功能。以下是两种实现JOIN的方法:…

    other 2023年5月9日
    00
  • vue使用自定义指令实现拖拽

    下面我将详细介绍如何使用自定义指令来实现拖拽功能。 什么是Vue自定义指令 Vue自定义指令本质上是一个指令函数,它接收两个参数:被绑定的元素和一个对象。在对象中你可以设置指令的各种选项和事件钩子。 实现拖拽的步骤 下面是实现拖拽功能的步骤: 1. 创建自定义指令 我们需要创建一个自定义指令,来绑定拖拽事件。在Vue中自定义指令可以使用Vue.directi…

    other 2023年6月25日
    00
  • 手机型号后缀字母代表什么意思呢 手机型号后缀字母含义介绍

    手机型号后缀字母代表的含义 手机型号后缀字母通常用于区分同一系列手机的不同版本或配置。不同手机品牌可能有不同的后缀字母含义,但下面是一些常见的后缀字母及其可能的含义。 1. 字母 \”S\” 字母 \”S\” 通常表示手机的升级版本或改进版。它可能代表以下含义: Super:表示该手机具有更强大的性能或更多的功能。例如,iPhone XS代表iPhone X…

    other 2023年8月5日
    00
  • linux安装vlc视频播放器

    Linux安装VLC视频播放器 VLC(VideoLAN Client)是一个流行的自由媒体播放器,它支持各种格式的音频和视频文件。在本文中,我们将介绍如何在Linux上安装VLC视频播放器。 步骤1:更新软件包 在开始安装VLC之前,建议你首先更新系统中的软件包。这可以确保你的系统有最新的库和依赖项。在终端中输入以下命令来更新软件包: sudo apt u…

    其他 2023年3月29日
    00
合作推广
合作推广
分享本页
返回顶部