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将字典内容存入mysql实例代码
Jan 18 Python
Python使用matplotlib实现的图像读取、切割裁剪功能示例
Apr 28 Python
一百行python代码将图片转成字符画
Feb 19 Python
Python判断telnet通不通的实例
Jan 26 Python
python面试题Python2.x和Python3.x的区别
May 28 Python
详解python中的数据类型和控制流
Aug 08 Python
利用python在大量数据文件下删除某一行的例子
Aug 21 Python
python-序列解包(对可迭代元素的快速取值方法)
Aug 24 Python
python文字转语音实现过程解析
Nov 12 Python
Python+MySQL随机试卷及答案生成程序的示例代码
Feb 01 Python
python爬虫智能翻页批量下载文件的实例详解
Feb 02 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
Feb 06 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中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
PHP return语句另类用法不止是在函数中
2014/09/17 PHP
Prototype 工具函数 学习
2009/07/23 Javascript
超越Jquery_01_isPlainObject分析与重构
2010/10/20 Javascript
jquery实现搜索框常见效果的方法
2015/01/22 Javascript
javascript中checkbox使用方法简单实例演示
2015/11/17 Javascript
JavaScript正则表达式替换字符串中图片地址(img src)的方法
2017/01/13 Javascript
javascript 的变量、作用域和内存问题
2017/04/19 Javascript
纯JS实现可用于页码更换的飞页特效示例
2018/05/21 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
Node.js 如何利用异步提升任务处理速度
2019/01/07 Javascript
详解微信小程序之scroll-view的flex布局问题
2019/01/16 Javascript
详解vue的数据劫持以及操作数组的坑
2019/04/18 Javascript
[12:51]71泪洒现场!是DOTA2让经典重现
2014/03/24 DOTA
Python浅拷贝与深拷贝用法实例
2015/05/09 Python
Python的Flask开发框架简单上手笔记
2015/11/16 Python
python实现人脸识别代码
2017/11/08 Python
pandas系列之DataFrame 行列数据筛选实例
2018/04/12 Python
pyqt5的QWebEngineView 使用模板的方法
2018/08/18 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
python对象与json相互转换的方法
2019/05/07 Python
python生成器用法实例详解
2019/11/22 Python
Python操作Sqlite正确实现方法解析
2020/02/05 Python
python离线安装外部依赖包的实现
2020/02/13 Python
Python3 获取文件属性的方式(时间、大小等)
2020/03/12 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
最简单的matplotlib安装教程(小白)
2020/07/28 Python
CSS3制作圆形滚动进度条动画的示例
2020/11/05 HTML / CSS
Html5之svg可缩放矢量图形_动力节点Java学院整理
2017/07/17 HTML / CSS
Volcom法国官网:美国冲浪滑板品牌
2017/05/25 全球购物
short s1 = 1; s1 = s1 + 1;有什么错? short s1 = 1; s1 += 1;有什么错?
2014/09/26 面试题
2014年协会工作总结
2014/11/22 职场文书
白鹤梁导游词
2015/02/06 职场文书
呼啸山庄读书笔记
2015/06/29 职场文书
电脑开机弹出documents文件夹怎么回事?弹出documents文件夹解决方法
2022/04/08 数码科技
Go中使用gjson来操作JSON数据的实现
2022/08/14 Golang