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

yizhihongxing

下面我将详细讲解如何使用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日

相关文章

  • go如何删除字符串中的部分字符

    可以使用Go语言中的字符串切片(slice)来删除字符串中的部分字符。下面是如何使用字符串切片来实现删除字符串中的部分字符的完整攻略: 使用字符串切片取出不需要删除的部分字符。 将需要删除的部分字符之外的字符串重新拼接起来。 下面是一个示例: package main import "fmt" func main() { s := &qu…

    other 2023年6月20日
    00
  • 详解使用Spring Boot开发Restful程序

    详解使用Spring Boot开发Restful程序攻略 简介 本攻略将详细介绍如何使用Spring Boot框架来开发Restful程序。Spring Boot是一个用于简化Spring应用程序开发的框架,它提供了自动配置和约定优于配置的原则,使得开发者可以更加专注于业务逻辑的实现。 步骤 步骤一:创建Spring Boot项目 首先,我们需要创建一个新的…

    other 2023年7月27日
    00
  • C++实现LeetCode(108.将有序数组转为二叉搜索树)

    C++实现LeetCode(108.将有序数组转为二叉搜索树)攻略 题目描述 给定一个有序整数数组,转换为高度平衡的二叉搜索树。 示例 1: 输入: [-10,-3,0,5,9] 输出: 0 / \ -3 9 / / -10 5 示例 2: 输入: [1,3] 输出: 3 / 1 题目分析 这道题目需要将有序整数数组转换为二叉搜索树,要求转换后的二叉树是平衡…

    other 2023年6月27日
    00
  • Apifox怎么使用?Apifox使用教程以及快捷键介绍

    很抱歉,由于当前平台的限制,我无法以标准的markdown格式文本回答您的问题。但是,我可以为您提供详细的攻略,包含两个示例说明。以下是关于Apifox使用的完整攻略: Apifox使用教程 Apifox是一个强大的接口管理工具,它提供了丰富的功能和快捷键,帮助您更高效地管理和测试接口。以下是使用Apifox的详细步骤: 注册和登录:首先,您需要在Apifo…

    other 2023年10月18日
    00
  • linux如何部署nginx

    Linux如何部署nginx 在Linux服务器上部署nginx可以快速搭建一个高性能的web服务器,本文将介绍如何在Linux上安装和配置nginx。 步骤一:安装nginx 使用命令行工具登录到Linux服务器; 安装nginx,命令如下: sudo apt update sudo apt install nginx 等待安装完成,安装成功后启动ngin…

    其他 2023年3月28日
    00
  • 非常精妙的PHP递归调用与静态变量使用

    PHP递归调用是指函数可以自己调用自己,并通过不断调用自己实现递归过程,这种调用方式可以很好的解决某些问题,避免使用循环带来的不必要的复杂性。 在使用递归时,静态变量的使用可以把递归函数中需要保留的变量(如累加器、计数器等)保存下来。静态变量不会在函数调用结束时销毁,而是在程序结束时才被销毁,这就保证了递归函数的正常运行。 以下是两个示例: 示例一:递归求和…

    other 2023年6月27日
    00
  • Android 不一样的原生分享

    Android 不一样的原生分享的完整攻略 在Android中,原生分享功能是一个非常常用的功能,可以让用户将内容分享到其他应用程序中。本文将详细讲解Android不一样的原生分享的完整攻略,包括如何使用Intent实现原生分享功能,以及如何自定义分享内容和分享界面。 使用Intent实现原生分享功能 在Android中,可以使用Intent实现原生分享功能…

    other 2023年5月5日
    00
  • Win10桌面版10587下载泄露 附下载地址

    Win10桌面版10587下载泄露 附下载地址攻略 简介 Win10桌面版10587是Windows 10操作系统的一个版本,该版本的下载地址泄露出来了。本攻略将详细介绍如何下载和安装Win10桌面版10587,并提供下载地址。 步骤 步骤一:获取下载地址 首先,我们需要获取Win10桌面版10587的下载地址。可以通过以下途径获取: 在线论坛:许多技术论坛…

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