Python单链表原理与实现方法详解

Python单链表原理与实现方法详解

什么是单链表

在计算机科学中,链表(Linked list)是一种常见的数据结构,是一种线性表,但是不像顺序表一样连续存储数据,而是在每一个节点(数据存储单元)里存放下一个节点的位置信息(即地址)。由于不必须按顺序存储,链表在插入的时候可以达到 O(1)O(1) 的复杂度,但是查找一个节点或者访问特定编号的节点则需要 O(n) 的时间,而顺序表相应的时间复杂度分别是 O(log n) 和 O(1)。

其中单链表是链表的一种,每个节点只有一个后继指针,即只能往一个方向移动。

单链表的实现

在Python中我们可以使用类来实现单链表的定义和操作。单链表的节点可以用一个类来表示,每个节点由两个部分组成,一个是存放数据的部分(存放我们要存储的值或数据对象),另一个是存放下一个节点的地址(指向下一个节点对象,在Python中表现为一个类的实例)。

class Node:
    #单链表的节点
    def __init__(self, data):
        self.data = data  #存储数据
        self.next = None  #存储下一个节点的地址,默认为空

首先,我们定义了一个Node的类,来实现单链表的每个节点。该类有两个属性:

  • data:用于存储数据的属性
  • next:该节点下一个节点的地址

具体的操作需要有一个LinkedList类来实现。该类将实现以下方法:

  • init():初始化链表。
  • add(data):向链表中添加一个节点。
  • delete(data):从链表中删除一个节点。
  • is_empty():链表是否为空。
  • get_length():返回链表的长度。
  • search(data):查找链表中是否存在数据data,如果存在返回True,否则返回False。
  • traverse():遍历整个链表,并打印每个节点的数据。
class LinkedList:
    #初始化链表
    def __init__(self):
        self.head = None  #初始化链表头

    #添加节点
    def add(self, data):
        new_node = Node(data)  #创建节点
        new_node.next = self.head  #将新节点的next连接到当前头部
        self.head = new_node  #将新节点作为新的头部

    #删除节点
    def delete(self, data):
        current_node = self.head
        previous_node = None
        while current_node:
            if current_node.data == data:
                if previous_node:
                    previous_node.next = current_node.next  
                else:
                    self.head = current_node.next
                return True
            previous_node = current_node
            current_node = current_node.next
        return False

    #判断链表是否为空
    def is_empty(self):
        return not bool(self.head)

    #获取链表长度
    def get_length(self):
        current_node = self.head
        count = 0
        while current_node:
            count += 1
            current_node = current_node.next
        return count

    #查找链表中是否存在某个数据
    def search(self, data):
        for node_data in self:
            if data == node_data:
                return True
        return False

    #遍历整个链表
    def traverse(self):
        current_node = self.head
        while current_node:
            yield current_node.data
            current_node = current_node.next

    #实现__iter__方法,方便遍历链表
    def __iter__(self):
        current_node = self.head
        while current_node:
            yield current_node.data
            current_node = current_node.next

单链表的示例应用

实例一:使用单链表操作一个简单的通讯录

#定义通讯录
contacts = LinkedList()

#添加联系人
contacts.add({'name': '张三', 'phone': '123456789'})
contacts.add({'name': '李四', 'phone': '987654321'})
contacts.add({'name': '王五', 'phone': '456789123'})

#获得通讯录长度
print('通讯录长度:', contacts.get_length())

#删除名为“李四”的联系人
contacts.delete({'name': '李四', 'phone': '987654321'})

#遍历通讯录
print('通讯录中的联系人:')
for contact in contacts.traverse():
    print(contact)

Output:

通讯录长度: 3
通讯录中的联系人:
{'name': '王五', 'phone': '456789123'}
{'name': '张三', 'phone': '123456789'}

实例二:使用单链表实现栈

#定义栈
class Stack:
    def __init__(self):
        self.container = LinkedList()

    #向栈中添加一个元素
    def push(self, data):
        self.container.add(data)

    #从栈中弹出一个元素
    def pop(self):
        if not self.is_empty():
            return self.container.head.data
        else:
            return None

    #判断栈是否为空
    def is_empty(self):
        return self.container.is_empty()

    #获得栈的长度
    def get_length(self):
        return self.container.get_length()

#创建栈
stack = Stack()

#向栈中添加元素
stack.push(1)
stack.push(2)
stack.push(3)

#从栈中弹出元素,并打印
while not stack.is_empty():
    print(stack.pop())

Output:

3
2
1

总结

通过这篇文章,我们学习了单链表的定义、实现方法和示例应用。在Python中,我们可以使用类来实现单链表,通过对节点的操作来实现链表的增删改等操作。同时我们还看到了两个具体的示例应用,一个是通讯录,一个是栈。单链表作为一种基本的数据结构,应用十分广泛。但是在实际应用中也需要我们具体问题具体分析,选择最合适的数据结构,以达到更好的效果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python单链表原理与实现方法详解 - Python技术站

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

相关文章

  • php 无法加载mysql的module的时候的配置的解决方案引发的思考

    对于这个问题,我们可以采取以下步骤进行解决。 1. 确认问题 首先,在出现问题之后,我们需要确认一下具体的错误信息,以便更好地解决问题。如果出现了类似于以下的错误提示: PHP Warning: PHP Startup: Unable to load dynamic library ‘/usr/lib/php/20180509/mysql.so’ – /us…

    other 2023年6月26日
    00
  • 知道IP地址怎么算网络地址? 网络地址的推算方法

    知道IP地址怎么算网络地址? 网络地址的推算方法 在计算机网络中,IP地址是用于标识网络上设备的唯一地址。网络地址是指一个网络的起始地址,用于确定该网络的范围。下面是计算网络地址的推算方法的详细攻略: 确定IP地址的类别:IP地址分为A类、B类、C类、D类和E类。根据IP地址的第一个字节的范围,可以确定其所属的类别。具体划分如下: A类地址:第一个字节范围为…

    other 2023年7月29日
    00
  • java实现链表反转

    关于java实现链表反转的攻略,可以按照以下步骤进行: 1. 设计 数据结构 首先,我们需要思考数据结构的设计。对于链表,每个节点需要两个属性:节点值和指向下一节点的指针。因此,我们可以设计一个Node类,它包含两个属性,一个是节点的值,另一个是它指向下一个节点的指针。具体代码如下: //定义节点 class Node { int val; Node nex…

    other 2023年6月27日
    00
  • Qt样式表的使用

    Qt样式表的使用 在Qt中,使用样式表可以自定义应用程序的外观,以此来展现自己的理念和风格。使用样式表可以非常方便地修改Qt应用程序的外观,实现更好的用户体验。 样式表语法 Qt的样式表采用了类似Css的语法,样式表主要分为三个部分: 选择器:选择需要修改样式的控件; 属性:需要修改控件的属性; 值:控件属性需要修改的目标值。 下面是一个简单的样式表示例: …

    其他 2023年3月28日
    00
  • Java解释器的运行过程介绍

    Java解释器的运行过程介绍 Java解释器是将Java源代码转换为可执行代码并执行的工具。它负责解析、编译和执行Java程序。下面是Java解释器的运行过程的详细介绍。 1. 词法分析和语法分析 Java解释器首先对源代码进行词法分析和语法分析。词法分析器将源代码分解为一个个的词法单元,如关键字、标识符、运算符等。语法分析器根据词法单元构建语法树,检查语法…

    other 2023年10月13日
    00
  • c#datagridview绑定数据源的几种常见方式

    以下是“C# DataGridView绑定数据源几种常见方式”的标准markdown格式文本,其中包含了两个示例说明: C# DataGridView绑定数据源几种常见方式 DataGridView是C#中常用的控件之一,它可以用于显示和编辑数据。文将介绍C# DataGridView绑数据源的几种常见方式,包括绑定DataTable、绑定List和绑定数据…

    other 2023年5月10日
    00
  • linuxfilesystem

    以下是关于Linux文件系统的完整攻略,包括基本介绍、实现步骤、示例说明等内容。 1. 基本介绍 Linux文件系统是Linux操作系统中用于管理文件和目录的一种机制。它是由文件和目录组成的层次结构,可以让用户方便地组织和管理文件。Linux文件系统支持多种文件系统类型,包括ext2、ext3、ext4、NTFS等。 2. 实现步骤 以下是使用Linux文件…

    other 2023年5月10日
    00
  • Linux系统下安装.bundle后缀程序的教程

    Linux系统下安装.bundle后缀程序的教程 有些软件在Linux系统中以.bundle后缀的形式提供,这些程序通常是二进制文件的集合,需要进行特殊的安装过程。下面是在Linux系统下安装.bundle后缀程序的完整攻略: 下载.bundle文件:首先,你需要从软件的官方网站或其他可信来源下载.bundle文件。通常,这个文件会以压缩包的形式提供,你需要…

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