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实现baidu hi自动登录的代码
Feb 10 Python
跟老齐学Python之??碌某?? target=
Sep 12 Python
python类和继承用法实例
Jul 07 Python
Python模块包中__init__.py文件功能分析
Jun 14 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
Python Pandas中根据列的值选取多行数据
Jul 08 Python
TensorFlow实现简单的CNN的方法
Jul 18 Python
决策树剪枝算法的python实现方法详解
Sep 18 Python
深度学习入门之Pytorch 数据增强的实现
Feb 26 Python
Python趣味实战之手把手教你实现举牌小人生成器
Jun 07 Python
python保存图片的四个常用方法
Feb 28 Python
virtualenv隔离Python环境的问题解析
Jun 21 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
第十三节--对象串行化
2006/11/16 PHP
PHP Header用于页面跳转要注意的几个问题总结
2008/10/03 PHP
php常用Stream函数集介绍
2013/06/24 PHP
PHP常用的缓存技术汇总
2014/05/05 PHP
php中file_exists函数使用详解
2015/05/08 PHP
PHP版微信小店接口开发实例
2016/11/12 PHP
php mysql获取表字段名称和字段信息的三种方法
2016/11/13 PHP
PHP中的函数声明与使用详解
2017/05/27 PHP
PHP实现通过CURL上传文件功能示例
2018/05/30 PHP
基于jQuery实现点击同时更改两个iframe的网址
2010/07/01 Javascript
jquery验证表单中的单选与多选实例
2013/08/18 Javascript
javascript创建和存储cookie示例
2014/01/07 Javascript
JQuery validate插件Remote用法大全
2016/05/15 Javascript
easyui-datagrid特殊字符不能显示的处理方法
2017/04/12 Javascript
深入浅析ES6 Class 中的 super 关键字
2017/10/20 Javascript
解析vue data不可以使用箭头函数问题
2018/07/03 Javascript
js实现同一个页面,多个enter事件绑定的示例
2018/10/10 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
Vue的自定义组件不能使用click方法的解决
2020/07/28 Javascript
[01:29:42]Liquid vs VP Supermajor决赛 BO 第一场 6.10
2018/07/05 DOTA
[01:37]PWL S2开团时刻DAY1&2——这符有毒
2020/11/20 DOTA
整理Python中的赋值运算符
2015/05/13 Python
Python简单实现安全开关文件的两种方式
2016/09/19 Python
Python快速排序算法实例分析
2017/11/29 Python
Python实现的求解最大公约数算法示例
2018/05/03 Python
Python基于Floyd算法求解最短路径距离问题实例详解
2018/05/16 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
Python爬取成语接龙类网站
2018/10/19 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
解决Django中调用keras的模型出现的问题
2019/08/07 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python中reload重载实例用法
2020/12/15 Python
JavaScript实现前端网页版倒计时
2021/03/24 Javascript
数控个人求职信范文
2014/02/03 职场文书
通知格式
2015/04/27 职场文书
解决pytorch-gpu 安装失败的记录
2021/05/24 Python