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显示天气预报
Mar 02 Python
十条建议帮你提高Python编程效率
Feb 16 Python
解决python3.5 正常安装 却不能直接使用Tkinter包的问题
Feb 22 Python
Ubuntu下Anaconda和Pycharm配置方法详解
Jun 14 Python
django数据模型on_delete, db_constraint的使用详解
Dec 24 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Python性能分析工具py-spy原理用法解析
Jul 27 Python
python 中关于pycharm选择运行环境的问题
Oct 31 Python
python飞机大战游戏实例讲解
Dec 04 Python
python 实现数据库中数据添加、查询与更新的示例代码
Dec 07 Python
ASP.NET Core中的配置详解
Feb 05 Python
python图像处理 PIL Image操作实例
Apr 09 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
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP使用CURL实现对带有验证码的网站进行模拟登录的方法
2014/07/23 PHP
PHP连接MSSQL时nvarchar字段长度被截断为255的解决方法
2014/12/25 PHP
php实现猴子选大王问题算法实例
2015/04/20 PHP
php上传功能集后缀名判断和随机命名(强力推荐)
2015/09/10 PHP
Yii2.0 Basic代码中路由链接被转义的处理方法
2016/09/21 PHP
yii2 resetful 授权验证详解
2017/05/18 PHP
PDO::commit讲解
2019/01/27 PHP
不用MOUSEMOVE也能滑动啊
2007/05/23 Javascript
flexigrid 类似ext grid的JS表格代码
2010/07/17 Javascript
jQuery为iframe的body添加click事件的实现代码
2011/04/07 Javascript
在浏览器窗口上添加遮罩层的方法
2012/11/12 Javascript
jquery弹出框的用法示例(2)
2013/08/26 Javascript
网站内容禁止复制和粘贴、另存为的js代码
2014/02/26 Javascript
javascript框架设计读书笔记之字符串的扩展和修复
2014/12/02 Javascript
node.js中的buffer.length方法使用说明
2014/12/14 Javascript
jQuery siblings()用法实例详解
2016/04/26 Javascript
Bootstrap响应式侧边栏改进版
2016/09/17 Javascript
Vue中正确使用jQuery的方法
2017/10/30 jQuery
微信小程序自定义底部弹出框
2020/11/16 Javascript
微信小程序自定义波浪组件使用方法详解
2019/09/21 Javascript
vue 解除鼠标的监听事件的方法
2019/11/13 Javascript
Python重新引入被覆盖的自带function
2014/07/16 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
python得到qq句柄,并显示在前台的方法
2018/10/14 Python
python 安装库几种方法之cmd,anaconda,pycharm详解
2020/04/08 Python
Python3 pyecharts生成Html文件柱状图及折线图代码实例
2020/09/29 Python
Python中的流程控制详解
2021/02/18 Python
服装机修工岗位职责
2013/12/26 职场文书
大队干部竞选演讲稿
2014/04/28 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
2015年艾滋病防治工作总结
2015/05/22 职场文书
解析目标检测之IoU
2021/06/26 Python
centos8安装nginx1.9.1的详细过程
2021/08/02 Servers
Java8中接口的新特性使用指南
2021/11/01 Java/Android
MySQL常用慢查询分析工具详解
2022/08/14 MySQL