数据结构:链表(Python语言实现)

这篇具有很好参考价值的文章主要介绍了数据结构:链表(Python语言实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

链表分为单链表、双链表、循环单链表和循环双链表。

本文以单链表为例,用python创建一个单链表数据结构,同时定义链表节点的增加、删除、查询和打印操作。

一、创建节点类

创建一个名为Node的节点类,节点类里面包含2个属性和1个方法。

  1. 节点类的属性

分别为data数据域属性和next指针域属性。

  1. 节点类的方法

has_value()方法,判断节点的值是否等于某个值。

# 创建节点类
class Node:
    def __init__(self, data):
        self.data = data
        self.next = None
        return
    def has_value(self, value):
        if self.data == value:
            return True
        else:
            return False

二、创建单链表类

创建一个名为singlelink的单链表类,其中包含3个属性和7个方法。

  1. 单链表类的属性

头结点head、尾节点tail和链表长度length。

  1. 单链表类的方法

(1)__init__():初始化方法。

(2)isempty():判断链表是否为空。

(3)add_node():在链表尾部添加一个节点。

(4)insert_node():在链表中的某个位置(从1开始)插入一个节点。

(5)delete_node_byid():通过位置(从1开始),在链表中删除对应的节点。

(6)find_node():查找某个值在链表中所在的位置(从1开始)。

(7)print_link():按顺序打印链表的值。

注意:insert_node()、delete_node_byid()和find_node()方法中的位置指从1开始计数,并非按python中列表索引值从0开始。

(一)__init__()

# 创建一个单链表类
class singlelink:
    # 初始化方法
    def __init__(self):
        self.head = None
        self.tail = None
        self.length = 0
        return

(二)isempty()

    # 判断链表是否为空
    def isempty(self):
        if self.length == 0:
            return True
        else:
            return False

(三)add_node()

    # 向链表尾部添加一个节点
    def add_node(self, item):
        if not isinstance(item, Node):  # 判断item是否是Node类型
            item = Node(item)   # 创建新节点
        if self.head is None:
            self.head = item
            self.tail = item
        else:
            self.tail.next = item
            self.tail = item
        self.length += 1
        return

(四)insert_node()

# 在链表中插入一个结点
    def insert_node(self, index, data):
        if self.isempty():
            print('this link is empty')
            return
        if index < 1 or index > self.length + 1:    # 插入序号不能大于长度或小于0
            print('error: out of index')
            return
        item = Node(data)
        if index == 1:
            item.next = self.head
            self.head = item
            self.length += 1
            return
        j = 1
        node = self.head
        prev = self.head
        while node.next and j < index:
            prev = node
            node = node.next
            j += 1
        if j == index:  # 在链表中间添加元素
            item.next = node
            prev.next = item
            self.length += 1
            return
        if node.next is None:  # 在链表尾部添加元素
            self.add_node(item)

(五)delete_node_byid()

# 通过索引,在链表中删除节点
    def delete_node_byid(self, item_id):
        if self.isempty():
            print('this link is empty, Unable to delete')
            return
        if item_id < 1 or item_id > self.length:
            print('error:out of index,Unable to delete')
        id = 1
        current_node = self.head
        previous_node = None
        while current_node is not None:
            if id == item_id:
                if previous_node is not None:
                    previous_node.next = current_node.next
                    return
                else:
                    self.head = current_node.next   # 删除头结点的情况
                    return
            previous_node = current_node
            current_node = current_node.next
            id += 1
        self.length -= 1
        return

(六)find_node()

# 通过数值,在链表中找到节点(返回该节点的所有位置)
    def find_node(self, value):
        current_node = self.head
        node_id = 1
        result = []
        while current_node is not None:
            if current_node.has_value(value):
                result.append(node_id)
            current_node = current_node.next
            node_id += 1
        return result

(七)print_link()

    def print_link(self):
        currrent_node = self.head
        while currrent_node is not None:
            print(currrent_node.data)
            currrent_node = currrent_node.next
        return

创建单链表,并进行增加、删除、查询等操作文章来源地址https://www.toymoban.com/news/detail-572976.html

# 创建三个节点
Node1 = Node('a')
Node2 = Node('b')
Node3 = Node('c')

# 定义一个空链表
link = singlelink()

# 判断是否是空链表
print(link.isempty())

# 尾部添加结点
for node in [Node1, Node2, Node3]:
    link.add_node(node)

# 在链表中插入位置
link.insert_node(2, 'e')
link.insert_node(4, 'f')
link.insert_node(4, 'f')
link.insert_node(8, 'h') # 无法插入

# 打印链表
link.print_link()
print('*****************')

# 删除元素
link.delete_node_byid(2)
link.print_link()

print('*****************')
# 查找元素
node_ids = link.find_node('f') # 查询元素5的位置
if len(node_ids) == 0:
    print('链表中无此元素')
else:
    print(node_ids)

到了这里,关于数据结构:链表(Python语言实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 双向链表--C语言实现数据结构

    本期带大家一起用C语言实现双向链表🌈🌈🌈 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的;简单来说,线性表的链式存储结构生成的表,称作“链表”。 每个元素本身由两部分组成: 1、本身的信息,称

    2024年02月04日
    浏览(60)
  • <数据结构> 链表 - 单链表(c语言实现)

    哨兵位结点也叫哑节点。哨兵位结点 也是头结点 。该节点 不存储有效数据,只是为了方便操作 (如尾插时用带哨兵位的头结点很爽,不需要判空)。 有哨兵位结点的链表,第一个元素应该是链表第二个节点(head - next,head为哨兵位结点)对应的元素。 有哨兵位结点的链表

    2023年04月11日
    浏览(135)
  • 数据结构——链表(python版)

    链表是一种在存储单元上非连续、非顺序的存储结构。数据元素的逻辑顺序是通过链表中的指针链接次序实现。链表是由一系列的结点组成,结点可以在运行时动态生成。每个结点包含两部分:数据域与指针域。数据域存储数据元素,指针域存储下一结点的指针。 单向链表也

    2024年02月14日
    浏览(35)
  • 【数据结构】—C语言实现双向链表(超详细!)

                                          食用指南:本文在有C基础的情况下食用更佳                                       🔥 这就不得不推荐此专栏了:C语言                                     🍀 双向链表 前 置知识 :单链表      

    2024年02月13日
    浏览(50)
  • Python数据结构与算法-数据结构(列表、栈、队列、链表)

    数据结构是指相互之间存在这一种或者多种关系的数据元素的集合和该集合中元素之间的关系组成。 简单来说,数据结构就是设计数据以何种方式组织并存储在计算机中。 比如:列表、集合与字典等都是一种数据结构。 N.Wirth:“程序=数据结构+算法” 数据结构按照其 逻辑结

    2024年02月08日
    浏览(58)
  • 【数据结构】C语言实现双向链表(带头结点、循环)

    结点定义: 接口定义: 我们将申请结点的代码封装成函数,方便后续使用 由于是带头结点的双向链表,因此在使用链表前,我们需要对链表进行初始化。 遍历链表,值得说的是,带头结点的双向链表的循环结束条件是 cur != phead 尾插时,需要先找到尾结点,然后将新结点插

    2024年02月03日
    浏览(72)
  • 【数据结构】链表OJ题(顺序表)(C语言实现)

    ✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅✅ ✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨✨ 🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿🌿 🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟 🌟🌟 追风赶月莫停留 🌟🌟 🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀🍀 🌟🌟 平芜尽处是春山

    2024年02月05日
    浏览(46)
  • (c语言实现)数据结构链表oj题(2)

    🎈个人主页:🎈 :✨✨✨初阶牛✨✨✨ 🐻推荐专栏: 🍔🍟🌯C语言进阶 🔑个人信条: 🌵知行合一 🍉本篇简介::分析力扣中有关链表的部分题目. 题目来源于:牛客网-题目链接 输入一个链表,输出该链表中倒数第k个结点。 示例: 输入:1,{1,2,3,4,5} 返回值:{5} 创建两个指针: ①

    2024年02月04日
    浏览(55)
  • c语言数据结构——链表的实现及其基本操作

    顺序表的问题及思考 问题: 中间/头部的插入删除,时间复杂度为O(N) 增容需要申请新空间,拷贝数据,释放旧空间。会有不小的消耗。 增容一般是呈2倍的增长,势必会有一定的空间浪费。例如当前容量为100,满了以后增容到 200,我们再继续插入了5个数据,后面没有数据插

    2023年04月09日
    浏览(85)
  • [C语言][数据结构][链表] 双链表的从零实现!

    目录 零.必备知识 0.1 一级指针 二级指针 0.2 双链表节点的成员列表         a. 数据         b. 后驱指针         c. 前驱指针 0.3 动态内存空间的开辟 一. 双链表的实现与销毁         1.1 节点的定义         1.2 双向链表的初始化 创建新节点         1.3 尾插       

    2024年04月17日
    浏览(245)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包