python双向链表实例详解


Posted in Python onMay 25, 2022

使用python实现双向链表,供大家参考,具体内容如下

双向链表: 指的是讲数据链接在一起,每个数据是一个节点,每一个节点都有一个数据区,两个链接区,分别链接上一个节点和下一个节点
数据区: 存放数据的地方

prev: 链接上一个节点
next: 链接下一个节点

双向链表操作

1、链表是否为空
2、链表的长度
3、遍历链表
4、链表头部添加元素
5、链表尾部添加元素
6、链表指定位置添加元素
7、链表删除节点
8、查找节点是否存在

代码实现

# Functions  函数声明
class Node():
    """实例化节点类"""
    def __init__(self, item):
        self.item = item
        self.prev = None
        self.next = None

class Linklist():
    """
    存储所有节点类
    """
    def __init__(self):
        """
        初始化一个头结点
        默认为空
        """
        self.head = None

    # 1. 链表是否为空
    def is_empty(self):
        return self.head == None

    # 2. 链表的长度
    def length(self):
        """
        返回节点的长度
        实例化一个游标
        使用这个游标遍历所有的数据
        使用一个计数器,遍历一个数据,自增一,最后输出计数器
        """
        # 实例化游标
        cur = self.head
        # 技术器
        # 如果链表为空,不会进入循环,直接输出 0
        count = 0
        # 遍历所有的数据
        while cur != None:
            count +=1
            cur = cur.next
        return count

    # 3. 遍历链表
    def treval(self):
        """
        遍历链表,获取所有的数据
        使用游标,遍历整个链表,每次输出cur.item 的值
        注意链表为空的情况,
        """
        # 实例化一个游标
        cur = self.head
        # 遍历链表
        while cur != None:
            print(cur.item, end=' ')
            cur = cur.next
        print()
    # 4. 链表头部添加元素
    def add(self, item):
        """
        头部添加数据
        分析:
        1、头部添加数据,链表为空时: self.head 指向node
        2、链表不为空时: 先将node.next = self.head.next, 再讲 self.head = node
        """
        # 实例化节点
        node = Node(item)
        # 添加数据
        # 判断链表是否为空
        if self.is_empty():
            # 为空,直接将self.head 指向node
            self.head=node
        else:
            # 不为空,先将noede
            node.next = self.head
            self.head.prev=node
            self.head=node

    # 5. 链表尾部添加元素
    def append(self,item):
        """
        尾部添加数据
        分析:
        要先将指针指向尾部的节点
        最后的节点的 cur.next = node, node.prev = cur
        """
        # 实例化节点
        node = Node(item)
        # 实例化游标
        cur = self.head
        # 移动游标到最后一个节点
        # 如果链表为空
        # 直接使用头插法
        if self.is_empty():
            self.add(item)
        else:
            while cur.next != None:
                # cur.next 不为空,则进入循环, 上次循环,是进入上上个节点,但 将cur  = cur.next,就指向了最后一个节点
                cur = cur.next
            node.prev = cur
            cur.next = node

    # 6. 链表指定位置添加元素
    def insert(self, index, item):
        """
        指定位置添加数据
        分析
        单链表中需要实例化两个有游标
        双向链表,直接向指针指向索引的位置
        将这个位置节点的 cur.
        """
        # 实例化节点
        node = Node(item)
        # 实例化游标
        cur = self.head
        # 起始位置
        count = 0
        if index<=0:
            # 使用头插法
            self.add(item)
        elif index > (self.length()-1):
            self.append(item)
        else:
            # 移动游标
            while count < index:
                # 增加一
                count += 1
                # 移动游标到索引位置
                cur = cur.next
            node.next = cur
            node.prev = cur.prev
            cur.prev.next = node
            cur.prev = node


    # 7. 链表删除节点
    def remove(self,item):
        """
        删除指定的节点
        首先实例化节点,遍历链表,找到该节点,删除该节点
        """
        # 实例化游标
        cur = self.head
        # 遍历链表,找到该节点
        while cur != None:
            if cur.item == item:
                if self.head == cur:
                    self.head = cur.next
                    if cur.next:
                        cur.next.prev = None
                else:
                    cur.prev.next = cur.next
                    # 如果有下个节点,防止最后一个节点
                    if cur.next:
                        cur.next.prev = cur.prev
                    pass
                break
            else:
                cur = cur.next

    # # 8. 查找节点是否存在
    def search(self, item):
        """
        查看节点是否存在
        分析
        遍历链表,查看每一个节点的数据区
        空链表
        只有头节点
        只有尾节点
        """
        # 实例化一个游标
        cur = self.head

        # 遍历链表
        while cur != None:
            if cur.item == item:
                return True
            else:
                cur = cur.next
        return False

测试运行

# 程序的入口
if __name__ == "__main__":
    s = Linklist()
    print(s.is_empty())  #  True
    s.append(100) 
    s.append(200)
    s.append(300)
    s.add(6)
    s.insert(1, 10)
    s.search(6)
    s.treval()   # 6 10 100 200 300 
    s.remove(100)
    s.treval()   # 6 10 200 300 
    pass

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
python模拟Django框架实例
May 17 Python
Django中间件工作流程及写法实例代码
Feb 06 Python
python中使用 xlwt 操作excel的常见方法与问题
Jan 13 Python
Django集成搜索引擎Elasticserach的方法示例
Jun 04 Python
python之pyqt5通过按钮改变Label的背景颜色方法
Jun 13 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
Aug 13 Python
python程序 线程队列queue使用方法解析
Sep 23 Python
Python魔法方法 容器部方法详解
Jan 02 Python
Python任务调度利器之APScheduler详解
Apr 02 Python
Python中常见的数制转换有哪些
May 27 Python
python实现按键精灵找色点击功能教程,使用pywin32和Pillow库
Jun 04 Python
python删除指定列或多列单个或多个内容实例
Jun 28 Python
Python实现双向链表基本操作
May 25 #Python
python实现双向链表原理
May 25 #Python
Python代码实现双链表
详解NumPy中的线性关系与数据修剪压缩
python实现双链表
May 25 #Python
Python实现双向链表
May 25 #Python
python区块链持久化和命令行接口实现简版
May 25 #Python
You might like
使用ThinkPHP的自动完成实现无限级分类实例详解
2016/09/02 PHP
详解PHP 7.4 中数组延展操作符语法知识点
2019/07/19 PHP
gearman中任务的优先级和返回状态实例分析
2020/02/27 PHP
通过判断JavaScript的版本实现执行不同的代码
2010/05/11 Javascript
jQuery实现鼠标滚轮动态改变样式或效果
2015/01/05 Javascript
调试JavaScript中正则表达式中遇到的问题
2015/01/27 Javascript
详解JavaScript基于面向对象之创建对象(2)
2015/12/10 Javascript
jQuery事件绑定用法详解(附bind和live的区别)
2016/01/19 Javascript
React/Redux应用使用Async/Await的方法
2017/11/16 Javascript
Vue2.x通用编辑组件的封装及应用详解
2019/05/28 Javascript
vue实现PC端录音功能的实例代码
2019/06/05 Javascript
Vue实现多标签选择器
2019/11/28 Javascript
VuePress 中如何增加用户登录功能
2019/11/29 Javascript
Vue学习笔记之计算属性与侦听器用法
2019/12/07 Javascript
关于vue属性使用和不使用冒号的区别说明
2020/10/22 Javascript
vue.js封装switch开关组件的操作
2020/10/26 Javascript
ant design vue中表格指定格式渲染方式
2020/10/28 Javascript
python遍历 truple list dictionary的几种方法总结
2016/09/11 Python
Python中标准模块importlib详解
2017/04/16 Python
Python求解任意闭区间的所有素数
2018/06/10 Python
解决django-xadmin列表页filter关联对象搜索问题
2019/11/15 Python
python中的yield from语法快速学习
2020/11/06 Python
Skyscanner英国:苏格兰的全球三大领先航班搜索服务之一
2017/11/09 全球购物
Herve Leger官网:标志性绷带连衣裙等
2018/12/26 全球购物
大学生专业个人学习的自我评价
2013/10/26 职场文书
结婚典礼证婚词
2014/01/08 职场文书
人力资源部经理的岗位职责
2014/03/04 职场文书
《三亚落日》教学反思
2014/04/26 职场文书
校园游戏活动新闻稿
2014/10/15 职场文书
2015年会计年终工作总结
2015/05/26 职场文书
勇敢的心观后感
2015/06/09 职场文书
会议新闻稿
2015/07/17 职场文书
2015年秋季运动会加油稿
2015/07/22 职场文书
js实现上传图片到服务器
2021/04/11 Javascript
Python 实现绘制子图及子图刻度的变换等问题
2021/05/31 Python
MongoDB数据库的安装步骤
2021/06/18 MongoDB