python——链表、双链表、链栈、链队列

13 篇文章 1 订阅
订阅专栏

目录

一、链表

链表类的定义:

创建链表——头插法

创建链表——尾插法

二、双链表

定义双链表

双链表——插入p节点

双链表——删除

小结

三、链栈

四、链队列

自学视频:B站-路飞学城-清华大学博士讲解python数据结构与算法

一、链表

介绍:链表是由一系列节点组成的元素集合,每个节点包含两个部分,数据域item 和指向下一个节点的指针next。通过节点之间的相互连接,最终串联成一个链表

链表类的定义:

class Node(object):
    def __init__(self, item):
        self.item = item   # 存数据
        self.next = None   # 存当前节点的下一个节点

测试:

if __name__ == '__main__':
    n1 = Node(1)
    n2 = Node(2)
    n3 = Node(3)
    n1.next = n2
    n2.next = n3

    print(n1.next.item)   # 2
    print(n1.next.next.item)   # 3
    print(n1.next.next.next.item)   # 报错

创建链表——头插法

新来的节点成为新的头结点head,倒序排列

def create_linklist(li):
    head = Node(li[0])
    for element in li[1:]:
        node = Node(element)   # 创建一个节点
        node.next = head
        head = node
    return head

测试:

lk = create_linklist([1, 2, 3])
print_linklist(lk)

 

创建链表——尾插法

新来的节点成为尾结点tail,顺序排列

def create_link_tail(li):
    head = Node(li[0])
    tail = head
    for element in li[1:]:
        node = Node(element)  # 创建一个节点
        tail.next = node
        tail = node
    return head

测试:

lk1 = create_link_tail([1,2,3])
print_linklist(lk1)

二、双链表

定义双链表

class Node(object):
    def __init__(self, item):
        self.item = item
        self.next = None
        self.prior = None

双链表——插入p节点

p.next = curNode.next

curNode.prior = p

p.prior = curNode

curNode.next = p

双链表——删除

定义p指向要删除的节点

p = curNode.next

curNode.next = p.next

p.next.prior = curNode

小结

链表与顺序表

链表在插入删除的操作上明显快于顺序表
链表的内存可更灵活的分配
利用链表实现栈和队列
链表的链式存储结构对树和图的结构有很大的启发性

三、链栈

# 定义链节点类
class LinkNode(object):
    def __init__(self, data):
        self.data = data   # 存数据
        self.next = None   # 存当前节点的下一个节点


# 链栈
class LinkStack(object):
    def __init__(self):
        self.top = LinkNode(None)  # 定义栈顶为空

    # 进栈
    def push(self, e):
        node = LinkNode(e)   # 创建一个新节点
        node.next = self.top   # 新节点的下一个指向top
        self.top = node    # top指向新节点

    # 出栈
    def pop(self):
        if self.top is None:
            print("栈为空!")
            exit()
        out_data = self.top.data
        self.top = self.top.next
        return out_data

    # 判空
    def is_empty(self):
        return self.top is None

    # 取栈顶元素
    def get_top(self):
        if self.top is None:
            print("栈为空!")
            return None
        return self.top.data

测试:

if __name__ == '__main__':
    ls = LinkStack()
    for element in range(5):
        ls.push(element)
    print(ls.get_top())
    print(ls.pop())
    print(ls.is_empty())

结果:

四、链队列

# 定义一个链表类
class LinkNode(object):
    def __init__(self, data):
        self.data = data
        self.next = None


# 定义一个链队列
class QueueLink(object):
    def __init__(self):
        temp_node = LinkNode(None)   # 创建一个空的链表节点
        self.rear = temp_node  # 队尾指针,指向空节点
        self.front = temp_node  # 队首指针,指向空节点

    # 创建一个链队列
    def create_linkQueue(self, li):
        for element in li:
            self.EnQueue(element)

    # 判空
    def is_empty(self):
        if self.front == self.rear:
            return True
        else:
            return False

    # 求队长
    def LenghQueue(self):
        head = self.front
        count = 0
        while head.next:
            count += 1
            head = head.next
        return count

    # 入队
    def EnQueue(self, e):
        node = LinkNode(e)   # 创建一个新节点
        if self.is_empty():
            self.front.next = node
        self.rear.next = node
        self.rear = node

    # 出队
    def DeQueue(self):
        if self.is_empty():
            print("队列为空!")
            exit()
        else:
            temp = self.front.next   # 定义temp指向队首元素
            self.front.next = temp.next   # 让front的next指针指向队首元素的下一个
            if self.rear == temp:
                # 该节点为尾结点
                self.front = self.rear
            return temp.data

    def Traverse(self):
        head = self.front
        while head.next:
            head = head.next
            print(head.data, end=" ")
        print(" ")

    def GetQueue(self):
        return self.front.next.data

测试:

if __name__ == '__main__':
    q1 = QueueLink()
    q1.create_linkQueue([1, 2, 3, 4, 5, 6])
    print("队列元素如下")
    q1.Traverse()
    print("队列的长度为{}".format(q1.LenghQueue()))
    print("队首元素为{}".format(q1.GetQueue()))
    for element in range(q1.LenghQueue()):
        print(q1.DeQueue(), end=" ")

结果:

 

python双向链表实现实例代码
12-25
python双向链表实现代码: 复制代码 代码如下:#!/usr/bin/python# -*- coding: utf-8 -*- class Node(object): def __init__(self,val,p=0): self.data = val self.next = p self.prev = p class LinkList...
Python单向链表和双向链表原理与用法实例详解
09-20
主要介绍了Python单向链表和双向链表原理与用法,结合实例形式详细分析了单向链表与双向链表的概念、原理以及创建、添加、删除等相关操作技巧,需要的朋友可以参考下
Python描述数据结构链队列
夏小悠的博客
08-07 2810
本篇章主要介绍链队列,并用Python实现其基本操作。
python双链表
最新发布
xiaoyang01234的博客
12-18 483
这里讲解一个双链表节点添加的例子,我们看到10,15,20这三个点的位置,其中原本是10和20相互连接,首先,我们要先将15的next指向20,因为,如果我们现将10的next指向15的话,那20的地址就会消失,这要就会导致我们的数据丢失,所以要先连接15和20,然后就是把20的prior(前驱)指向15,最后再是15的prior(前驱)指向10,10的next指向15,这样我们就完成插入的程序了。
链表、栈、队列基础总结
weixin_56324038的博客
10-23 351
链式结构:数据元素存储在彼此相互独立的内存中,每个独立的元素也叫做结点,每个结点中增加一项数据项用于存储其他相关结点的地址,以此表示结点之间的关系。
python链表实现栈_python中栈的单链表实现
weixin_39914732的博客
11-20 78
class StackFullException(Exception): #满栈时要抛出的异常passclass StackEmptyException(Exception): #空栈时要抛出的异常passclassNode:def __init__(self, val=None, nxt=None):self.value= val #信息域self.next = nxt #指针域def...
python链表实现栈_[Python] 数据结构--实现顺序表、链表、栈和队列
weixin_39928017的博客
11-20 174
说明:本文主要展示Python实现的几种常用数据结构:顺序表、链表、栈和队列。附有实现代码。来源主要参考网络文章。一、顺序表1、顺序表的结构一个顺序表的完整信息包括两部分,一部分是表中元素集合,另一部分是为实现正确操作而需记录的信息,即有关表的整体情况的信息,这部分信息主要包括元素存储区的容量和当前表中已有的元素个数两项。2、顺序表的两种基本实现方式图a 为一体式结构,存储表信息的单元与元素存储区...
图解数据结构(使用Python)——链表
12-21
概念:链表(Linked List)是由许多相同数据类型的数据按特定顺序排列而成的线性表,其特点是各个数据在计算机内存中的位置是不连续且随机的。 优点: 数据的插入和删除都比较方便,不需要移动大量的数据(列表在...
LinkLink_curd_Python双向链表_游标排序_
09-29
Python双向链表
python双向链表原理与实现方法详解
12-23
本文实例讲述了python双向链表原理与实现方法。分享给大家供大家参考,具体如下: 双向链表 一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向...
数据结构(五)——双链表、链式栈、链式队列 及实现
MATLAB进阶
03-20 561
http://blog.csdn.net/fansongy/article/details/6792628一、双链表在单链表的基础上再增加一个指向它前驱的指针,就构成了双链表。所以双链表有三个变量:数据信息info、前驱指针llink、后继指针rlink。 二、双链表操作和实现   由于双链表也为单链表的一种变型,一些相似的操作就没一一列举,可以参考数据结构(四)——单链表 、带头结点的单链表、循...
链式队列的基本操作(详细)
qq_43346784的博客
07-08 7704
队列的基本操作()链式 ,详细
python中的链表
m0_54146002的博客
09-14 545
单向链表也叫单链表,是链表中最简单的一种形式,他的每个节点包含两个域,一个信息域(元素域)和一个链接域。这个链接指向链表中的下一个节点,而最后一个节点的连接域则指向一个空值。(3)变量 p 指向链表的头节点(首节点)的位置,从 p 出发能找到表中的任意节点。(2)链接域 next 用来存放下一个节点的位置(python 中的标识)(1)表元素域 elem 用来存放具体的数据。
简析Python中的四种队列
python学习者的博客
05-21 7103
队列是一种只允许在一端进行插入操作,而在另一端进行删除操作的线性表。 在Python文档中搜索队列(queue)会发现,Python标准库中包含了四种队列,分别是queue.Queue / asyncio.Queue / multiprocessing.Queue / collections.deque。 collections.deque deque是双端队列(double-ended q...
Python3 链表、队列和栈的实现
liangjiubujiu的博客
09-22 663
# -!- coding: utf-8 -!- # !/usr/bin/env python 3.6.3 # author: Vivian # time: 2018/9/16 # 使用list列表构造栈 class Stack(object): def __init__(self): # 设置私有变量,不允许修改 self.__list = [] ...
python实现链表
热门推荐
Tonywu2018的博客
03-30 2万+
目录 1. 链表结构 1.1 单链表双链表 1.2 非连续性内存和节点 1.3 定义并使用单链表节点类 2. 单向链表的操作 2.1 遍历 2.2 搜索 2.3 替换 2.4 插入 2.4.1 在开始处插入 2.4.2 在末尾插入 2.4.3 在任意位置插入 2.5 删除 2.5.1 在开始处删除 2.5.2 在末尾删除 2.5.3 在任意位置删除 2.6 单链...
Python数据结构-双链表
小萌新BLOG
01-20 362
数据结构双链表和循环双链表 (一)理论知识 链表:将表元素存放在通过链接构成的存储块中,用链接关系表示元素间的顺序关联,存储块亦成为表结点。 结构类型: (1)基本单链表:首端插入/删除效率高,但尾端操作效率低    (2)含尾结点引用的单链表:首端插入/删除、尾端插入效率高,但尾端删除效率低    (3)双链表: 单链表只能做一个方向地扫描和逐步操作,即使加入了尾结点...
Python中方法链的使用方法
JackLiu16的博客
11-04 1285
return self   这篇文章主要为大家详细介绍了Python中方法链的使用方法,方法链(method chaining)是面向对象的编程语言中的一种常见语法,对方法链感兴趣的小伙伴们可以参考一下 方法链(method chaining)是面向对象的编程语言中的一种常见语法,可以让开发者在只引用对象一次的情况下,对同一个对象进行多次方法调用。举个例子: 假设我们有一个Foo类,其中包...
python实现双向链表
qq_39112101的博客
06-12 473
双向链表示意图如下: 在头部插入元素如下图所示: 让node的next指向值为100的节点,也就是让node.next = self.__head。 让头(蓝色区域)指向node节点,也就是self.__head =node 让值为100区域的prev指向node节点,也就是node.next.prev = node 在尾部插入元素如下图所示: node.nex...
python双向链表
10-19
Python双向链表是一种数据结构,它由多个节点组成,每个节点都包含一个数据元素和两个指针,一个指向前一个节点,一个指向后一个节点。相比于单向链表,双向链表可以在节点之间双向遍历,使得某些操作更加高效。在...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • python--字典版学生成绩管理系统 11684
  • 递归算法——八皇后问题 python 4474
  • 栈和队列——python 3242
  • Python之文件操作_读取_编码_os模块 2529
  • Python——函数版用户管理系统 1914

分类专栏

  • python数据结构与算法 13篇
  • python基础学习 6篇
  • Django 2篇

最新评论

  • 蓝桥杯python——真题练习之消除游戏

    jsxq_: 这个代码只过了一个测试样例吗

  • 蓝桥杯python组——真题练习-技能升级

    weixin_46722609: 好牛的思路

  • 蓝桥杯python——真题练习之消除游戏

    2301_81642437: 存放的下标是否需要排序,再从最后一个取出来删除

  • 蓝桥杯python组——真题练习-技能升级

    TSpi..: 这解法可以

  • 洛谷P1605迷宫问题——python

    m0_70728422: 😭蓝桥杯要去做基数了

大家在看

  • day08 | 反转字符串、反转字符串||、替换数字 460
  • MySQL57和80安装,以及同时安装,仅此一篇即可 1186
  • 字符数组的一些练习 191
  • Redis入门教程
  • Python API自动化:提升开发效率的利器 1092

最新文章

  • 蓝桥杯python组——真题练习-技能升级
  • 蓝桥杯python——真题练习之消除游戏
  • 洛谷P1216数字三角形-python
2023年12篇
2022年20篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TWAS@py

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或 充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值

聚圣源五行八字起名测名的筑业资料捡漏小说凯立德导航地图饥肠辘辘的意思恒丰非常人贩2非淡泊无以明志非宁静无以致远的意思带花的诗句火命起名带木还是带火给宝宝免费起名字软件陷阱马东锡9人禁闭室喜马拉雅APP食言而肥起睿名字大全海贼王在线观看全集免费樱花动漫叶三言不由衷的意思闺蜜头像一对两张侯氏男孩起名铁根游戏解说关于美食的作文中国vs伊朗足球孔字怎么起名姓周起名注意什么姓黎的起名政法频道福州三坊七巷998游戏官方下载淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻让美丽中国“从细节出发”清明节放假3天调休1天男孩疑遭霸凌 家长讨说法被踢出群国产伟哥去年销售近13亿网友建议重庆地铁不准乘客携带菜筐雅江山火三名扑火人员牺牲系谣言代拍被何赛飞拿着魔杖追着打月嫂回应掌掴婴儿是在赶虫子山西高速一大巴发生事故 已致13死高中生被打伤下体休学 邯郸通报李梦为奥运任务婉拒WNBA邀请19岁小伙救下5人后溺亡 多方发声王树国3次鞠躬告别西交大师生单亲妈妈陷入热恋 14岁儿子报警315晚会后胖东来又人满为患了倪萍分享减重40斤方法王楚钦登顶三项第一今日春分两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?周杰伦一审败诉网易房客欠租失踪 房东直发愁男子持台球杆殴打2名女店员被抓男子被猫抓伤后确诊“猫抓病”“重生之我在北大当嫡校长”槽头肉企业被曝光前生意红火男孩8年未见母亲被告知被遗忘恒大被罚41.75亿到底怎么缴网友洛杉矶偶遇贾玲杨倩无缘巴黎奥运张立群任西安交通大学校长黑马情侣提车了西双版纳热带植物园回应蜉蝣大爆发妈妈回应孩子在校撞护栏坠楼考生莫言也上北大硕士复试名单了韩国首次吊销离岗医生执照奥巴马现身唐宁街 黑色着装引猜测沈阳一轿车冲入人行道致3死2伤阿根廷将发行1万与2万面值的纸币外国人感慨凌晨的中国很安全男子被流浪猫绊倒 投喂者赔24万手机成瘾是影响睡眠质量重要因素春分“立蛋”成功率更高?胖东来员工每周单休无小长假“开封王婆”爆火:促成四五十对专家建议不必谈骨泥色变浙江一高校内汽车冲撞行人 多人受伤许家印被限制高消费

聚圣源 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化