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三元运算实现方法
Jan 12 Python
Python中使用Beautiful Soup库的超详细教程
Apr 30 Python
基于python时间处理方法(详解)
Aug 14 Python
django 使用 request 获取浏览器发送的参数示例代码
Jun 11 Python
python定向爬虫校园论坛帖子信息
Jul 23 Python
Python 从相对路径下import的方法
Dec 04 Python
Django 创建后台,配置sqlite3教程
Nov 18 Python
Python TestSuite生成测试报告过程解析
Jul 23 Python
简述python&amp;pytorch 随机种子的实现
Oct 07 Python
Python爬虫之Selenium中frame/iframe表单嵌套页面
Dec 04 Python
Pytorch如何切换 cpu和gpu的使用详解
Mar 01 Python
python opencv将多个图放在一个窗口的实例详解
Feb 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
php批量删除超链接的实现方法
2015/10/19 PHP
yii2实现 &quot;上一篇,下一篇&quot; 功能的代码实例
2017/02/04 PHP
PHP中一个有趣的preg_replace函数详解
2018/08/15 PHP
IE php关于强制下载文件的代码
2008/08/23 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
JS获取页面窗口大小的代码解读
2011/12/01 Javascript
JavaScript Scoping and Hoisting 翻译
2012/07/03 Javascript
jQuery使用技巧简单汇总
2013/04/18 Javascript
node.js中的fs.open方法使用说明
2014/12/17 Javascript
DOM节点深度克隆函数cloneNode()用法实例
2015/01/12 Javascript
比较常见的javascript中定义函数的区别
2015/11/09 Javascript
详解javascript函数的参数
2015/11/10 Javascript
全国省市二级联动下拉菜单 js版
2016/05/10 Javascript
AngularJs Modules详解及示例代码
2016/09/01 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
微信小程序实现商品属性联动选择
2019/02/15 Javascript
python提示No module named images的解决方法
2014/09/29 Python
Python使用matplotlib绘图无法显示中文问题的解决方法
2018/03/14 Python
Python中数组,列表:冒号的灵活用法介绍(np数组,列表倒序)
2018/04/18 Python
pytorch 调整某一维度数据顺序的方法
2018/12/08 Python
使用Python操作FTP实现上传和下载的方法
2019/04/01 Python
基于python requests selenium爬取excel vba过程解析
2020/08/12 Python
Django框架实现在线考试系统的示例代码
2020/11/30 Python
英国手工布艺沙发在线购买:Sofas & Stuff
2018/03/02 全球购物
什么是serialVersionUID
2016/03/04 面试题
如何做好总经理助理
2013/11/12 职场文书
财务会计毕业生个人求职信
2014/02/03 职场文书
残疾人小组计划书
2014/04/27 职场文书
酒店管理专业自荐信
2014/05/23 职场文书
社区平安建设方案
2014/05/25 职场文书
财务管理专业毕业生求职信
2014/06/02 职场文书
公司活动总结怎么写
2014/06/25 职场文书
2014年组织部工作总结
2014/11/14 职场文书
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
分享几种python 变量合并方法
2022/03/20 Python
CSS 鼠标点击拖拽效果的实现代码
2022/12/24 HTML / CSS