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中的对象拷贝示例 python引用传递
Jan 23 Python
python的类变量和成员变量用法实例教程
Aug 25 Python
Python中的异常处理学习笔记
Jan 28 Python
Python 字符串大小写转换的简单实例
Jan 21 Python
对python3 urllib包与http包的使用详解
May 10 Python
mac安装scrapy并创建项目的实例讲解
Jun 13 Python
使用Python写一个量化股票提醒系统
Aug 22 Python
python实现的接收邮件功能示例【基于网易POP3服务器】
Sep 11 Python
python文件操作seek()偏移量,读取指正到指定位置操作
Jul 05 Python
python如何随机生成高强度密码
Aug 19 Python
python 实时调取摄像头的示例代码
Nov 25 Python
python自动统计zabbix系统监控覆盖率的示例代码
Apr 03 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 Undefined index和Undefined variable的解决方法
2008/03/27 PHP
WordPress导航菜单的滚动和淡入淡出效果的实现要点
2015/12/14 PHP
利用PHP获取网站访客的所在地位置
2017/01/18 PHP
PHP通过文件路径获取文件名的实例代码
2018/10/14 PHP
thinkPHP5.1框架使用SemanticUI实现分页功能示例
2019/08/03 PHP
php实现登录页面的简单实例
2019/09/29 PHP
JavaScript获得当前网页来源页面(即上一页)的方法
2015/04/03 Javascript
jquery仿百度百科底部浮动导航特效
2015/08/08 Javascript
jquery实现的判断倒计时是否结束代码
2016/02/05 Javascript
Javascript前端经典的面试题及答案
2017/03/14 Javascript
关于js中的鼠标事件总结
2017/07/11 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
基于AngularJS拖拽插件ngDraggable.js实现拖拽排序功能
2019/04/02 Javascript
微信小程序调用天气接口并且渲染在页面过程详解
2019/06/24 Javascript
微信小程序动画组件使用解析,类似vue,且更强大
2019/08/01 Javascript
JavaScript将数组转换为链表的方法
2020/02/16 Javascript
[40:03]RNG vs VG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
[01:00:22]DOTA2-DPC中国联赛定级赛 LBZS vs Magma BO3第三场 1月10日
2021/03/11 DOTA
Pycharm学习教程(5) Python快捷键相关设置
2017/05/03 Python
Python进程间通信Queue实例解析
2018/01/25 Python
Python2实现的图片文本识别功能详解
2018/07/11 Python
Python socket模块方法实现详解
2019/11/05 Python
简单了解python数组的基本操作
2019/11/26 Python
Python如何实现后端自定义认证并实现多条件登陆
2020/06/22 Python
Django REST Swagger实现指定api参数
2020/07/07 Python
Pandas直接读取sql脚本的方法
2021/01/21 Python
HTML5的新特性(1)
2016/03/03 HTML / CSS
canvas之自定义头像功能实现代码示例
2017/09/29 HTML / CSS
皮尔·卡丹巴西官方商店:Pierre Cardin
2017/07/21 全球购物
波兰最大的电商平台:Allegro.pl
2021/02/06 全球购物
给女朋友的道歉信
2014/01/10 职场文书
2014年教育工作总结
2014/11/26 职场文书
药品开票员岗位职责
2015/04/15 职场文书
Python实战之用tkinter库做一个鼠标模拟点击器
2021/04/27 Python
Python实现的扫码工具居然这么好用!
2021/06/07 Python
linux下安装redis图文详细步骤
2021/12/04 Redis