python中的数据结构之链表浅谈

目录

数据结构概述

链表的分类及python中的实现方式


  • 数据结构概述

       众所周知,python中的数据类型共有8类,列表、字典、集合、数值类型(分为int类型和float类型)、布尔类型、字符串、元组。按照地址不变时可否改变原始数据,又将前三种划分可变类型,后五种划分为不可变类型。

       而今天所谈的数据结构,指的是数据的存储组成方式,即数据元素之间存在着一种或多种特定关系。挑选合适的数据结构能给实际开发工作带来更高的运行和存储效率。

        如上所述,我们根据元素间关系的特点,进一步将数据结构分成两类:

①线程结构

②非线性结构

       上图中,可以看出:线性结构的元素间是一对一的线性关系,每个元素至多存在一个前驱和一个后继;而非线性结构中的元素间是多对多的关系,每个元素存在多个前驱或多个后继。在python中,线性结构的有:队列、栈,非线性结构的有:树、图

  • 链表的分类及python中的实现方式

       链表属于线性结构的一种,其特点在于存储的不连续性。相较于使用连续存储方式的顺序表,在内存空间相对不足的情况下,更为适用。链表中每个元素(以下称节点),由两部分构成:元素域、地址域,元素域用来存放数据,地址域用来存放下一个节点的地址(即指向下一个节点)。

       按照地址域的数量,我们将链表分成:单向链表(上图)、双向链表(节点中有前地址域和后地址域)。再按照首尾节点是否相连,又将其分为:循环链表与非循环链表。那么,我们如何在python中实现链表结构呢?

        答案:基于面向对象的思维来构建。我们可将整个链表结构分为两个类:节点类、链表类,在节点类中定义属性:元素域data,地址域next,在链表类中定义属性:链表的头结点head。以一一个单向链表为例,编程如下:

# 定义节点类 SingleNode
class SingleNode:
    # 初始化节点的两个属性值:元素域、地址域
    def __init__(self,data):
        self.data = data
        self.next = None

# 定义链表类 SingleLinkedList:
class SingleLinkedList:
    # 初始化链表的属性:头结点
    def __init__(self,node):
        self.head = node

# 测试链表
if __name__ == '__main__':
    # 创建两个节点对象
    node1 = SingleNode([1,2,3])
    node2 = SingleNode([4,5,6])
    # 将两个节点连接
    node1.next = node2
    # 创建链表对象
    linked_list = SingleLinkedList(node1)
    # 遍历输出,cur代表当前指针变量
    cur = linked_list.head
    while cur is not None:
        print(cur.data)
        # 指针迭代
        cur = cur.next

输出结果,见下图:

       根据需求,我们可以对链表中的各节点进行增删改查等操作,相应的方法可以直接写在链表类中,便于我们直接调用操作。由于篇幅有限,接下来只演示删除节点的编码:

# 定义链表类 SingleLinkedList:
class SingleLinkedList:
    # 初始化链表的属性:头结点
    def __init__(self,node):
        self.head = node

# 功能:remove(self, data)删除节点
    def remove(self,data):
        # 将头节点赋值给变量cur
        cur = self.head
        # 设置辅助游标
        pre = None
        # 非空则遍历,获取每个节点
        while cur is not None:
            # 判断是否为要删除的值
            if cur.data == data:
                # 判断是否为头节点
                if cur == self.head:
                    self.head = cur.next
                else:
                    pre.next = cur.next
                break
            else:
                pre = cur
                cur = cur.next

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值