python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】

Python单向链表的基本实现与使用方法

单向链表是一种常见的数据结构,它由一个个节点构成,每个节点包含一个数据元素和一个指向下一个节点的指针。本文将介绍Python中单向链表的基本实现与使用方法,包括定义、遍历、添加、删除、查找等操作。

定义一个单向链表节点

首先,让我们定义一个单向链表节点类。每个节点由一个数据元素和一个指向下一个节点的指针组成,代码如下:

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

构建一个单向链表

构建一个单向链表,我们需要至少两个节点:头节点和尾节点。头节点是链表的开始处,尾节点是链表的结束处。我们可以定义一个链表类来维护头节点和尾节点,代码如下:

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

在构建链表时,头节点和尾节点都为空。下面我们来实现链表的基本功能。

添加一个节点

第一个节点添加到空链表时,它既是头节点,也是尾节点。接下来的节点都添加到尾节点之后。在单向链表中,我们只需要维护尾节点的指针。添加操作的代码如下:

    def add(self, data):
        if not self.head:
            self.head = Node(data=data)
            self.tail = self.head
        else:
            self.tail.next = Node(data=data)
            self.tail = self.tail.next

上述代码的执行步骤如下:

  1. 如果头节点为空,将新数据作为头节点,并将尾节点也指向它;
  2. 如果头节点不为空,将新节点追加到尾节点之后,并将尾节点指针指向它。

遍历链表

遍历链表通常是通过循环来实现的。我们从头节点开始遍历每个节点,直到到达尾节点。整个遍历过程的代码如下:

    def traverse(self):
        if not self.head:
            print("LinkedList is empty")
        else:
            node = self.head
            while node:
                print(node.data, end=" ")
                node = node.next

当链表为空时,输出“LinkedList is empty”,否则从头节点开始遍历每个节点,并输出它的值。

查找一个节点

查找一个节点,我们同样需要从头节点开始遍历。我们比较每个节点的值和查找目标的值是否相等,如果相等则返回这个节点。查找操作的代码如下:

    def find(self, target):
        if not self.head:
            return None
        node = self.head
        while node:
            if node.data == target:
                return node
            node = node.next
        return None

如果链表为空,直接返回None;否则从头节点开始遍历每个节点,比较其值和查找目标的值是否相等,如果相等返回该节点,否则返回None。

删除一个节点

删除一个节点,我们同样需要从头节点开始遍历。我们比较每个节点的值和删除目标的值是否相等,如果相等则删除这个节点。删除操作的代码如下:

    def delete(self, target):
        if not self.head:
            return None
        if self.head.data == target:
            self.head = self.head.next
            return
        node = self.head
        while node.next:
            if node.next.data == target:
                node.next = node.next.next
                if not node.next:
                    self.tail = node
                return
            node = node.next

如果链表为空,直接返回None;否则从头节点开始遍历每个节点,比较其值和删除目标的值是否相等,如果相等删除该节点,删除后更新尾节点的指针。

示例说明

下面通过两个例子来演示单向链表的基本操作。

例子1

构建一个链表,包含四个元素:1,3,5,7。

linked_list = LinkedList()
linked_list.add(1)
linked_list.add(3)
linked_list.add(5)
linked_list.add(7)
linked_list.traverse()

输出结果为:1 3 5 7。

例子2

构建一个链表,包含四个元素:2,4,6,8。

linked_list = LinkedList()
linked_list.add(2)
linked_list.add(4)
linked_list.add(6)
linked_list.add(8)
print(linked_list.find(4).data)
linked_list.delete(4)
linked_list.traverse()

输出结果为:4 2 4 6 8,2 6 8。注意:在操作过程中会有一行输出4,这是使用find方法查找节点4,并输出其值。然后使用delete方法删除节点4,最终输出遍历后的链表结果。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:python单向链表的基本实现与使用方法【定义、遍历、添加、删除、查找等】 - Python技术站

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

相关文章

  • Java数据结构实现二维数组与稀疏数组转换详解

    Java数据结构实现二维数组与稀疏数组转换详解 一、二维数组与稀疏数组 在介绍二维数组与稀疏数组的转换之前,需要先了解它们的定义和特点。 1.二维数组 二维数组是一个由多个一维数组组成的数组。可以将它理解为是一个由行和列构成的矩阵。其中,行和列的数量是固定的,而且必须预先指定。 二维数组的声明方式为: 数据类型[][] 数组名; 例: int[][] arr…

    other 2023年6月27日
    00
  • Android使用ExpandableListView实现三层嵌套折叠菜单

    Android使用ExpandableListView实现三层嵌套折叠菜单攻略 1. 概述 ExpandableListView是Android中的一个可折叠列表视图,可以用于实现多级嵌套的折叠菜单。本攻略将详细介绍如何使用ExpandableListView实现三层嵌套折叠菜单。 2. 步骤 2.1 准备工作 在Android项目中,首先需要在布局文件中添…

    other 2023年7月28日
    00
  • Go语言中的变量声明和赋值

    Go语言中的变量声明和赋值 在Go语言中,变量声明和赋值是非常重要的基础知识。本攻略将详细讲解Go语言中的变量声明和赋值的语法和用法。 变量声明 在Go语言中,可以使用关键字var来声明一个变量。变量声明的一般语法如下: var 变量名 类型 其中,变量名是你给变量起的名字,类型是变量的数据类型。下面是一个示例: var age int 上面的代码声明了一个…

    other 2023年8月9日
    00
  • Java Web开发防止多用户重复登录的完美解决方案

    Java Web开发防止多用户重复登录的完美解决方案 在 Java Web 开发中,通常需要考虑如何防止多用户重复登录的问题。为了避免这种情况的发生,我们可以采用以下方法来解决。 1. 使用 Session 实现用户登录控制 Session 是 Web 应用程序中的一种状态管理技术,用于在服务器端存储用户会话数据。通过使用 Session,我们可以轻松实现用…

    other 2023年6月26日
    00
  • 基于一个简单定长内存池的实现方法详解

    基于一个简单定长内存池的实现方法详解 什么是内存池 内存池是一种常见的内存管理机制,主要应用于频繁进行内存分配和释放的场景。内存池会在程序初始化时先分配固定大小的内存块,程序执行中使用时直接从内存池中获取可用内存,使用完毕后放回内存池中,避免频繁进行内存分配和释放过程,从而提高程序的性能。 实现方法 以下是一个简单的内存池实现方法: 内存池初始化 先定义一个…

    other 2023年6月27日
    00
  • Win11登录界面怎么显示账户详细信息? Win11登录界面设置技巧

    Win11登录界面默认只会显示一个账户名或者邮箱,但是有些用户可能需要在登录界面显示更多的账户信息,比如头像、用户名等等。本文就来详细讲解如何在Win11登录界面显示账户详细信息,以及一些Win11登录界面设置的技巧。 显示账户详细信息 要在Win11登录界面显示账户详细信息,可以使用微软提供的一个现成工具“Accounts Configuration”来完…

    other 2023年6月27日
    00
  • Java环境变量配置教程

    下面是“Java环境变量配置教程”的完整攻略: Java环境变量配置教程 Java是一种跨平台语言,因此在安装Java开发环境时需要配置环境变量。这样可以在命令行或终端中直接运行Java程序,提高程序员的工作效率。下面是Java环境变量配置的详细步骤。 第一步:下载并安装Java 首先需要从官网(https://www.java.com/)下载安装Java运…

    other 2023年6月27日
    00
  • feign参数过多导致调用失败的解决方案

    当使用Feign调用服务端接口时,由于参数过多而导致调用失败的情况比较常见。在此提供以下解决方案: 方案一:POST请求 通过将请求方式由GET改为POST,可以解决参数过多导致调用失败的问题。 示例代码: @FeignClient(name = "sample") public interface SampleFeignClient {…

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