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文件和目录操作函数小结
Jul 11 Python
python实现从字符串中找出字符1的位置以及个数的方法
Aug 25 Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 Python
python解决方案:WindowsError: [Error 2]
Aug 28 Python
python中pip的安装与使用教程
Aug 10 Python
python操作excel的方法
Aug 16 Python
用python做游戏的细节详解
Jun 25 Python
Pandas中resample方法详解
Jul 02 Python
Python Numpy库datetime类型的处理详解
Jul 13 Python
python实现H2O中的随机森林算法介绍及其项目实战
Aug 29 Python
jupyter notebook 增加kernel教程
Apr 10 Python
python实战之90行代码写个猜数字游戏
Apr 22 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 设计模式之 工厂模式
2008/12/19 PHP
PHP 压缩文件夹的类代码
2009/11/05 PHP
个人写的PHP验证码生成类分享
2014/08/21 PHP
php采用curl实现伪造IP来源的方法
2014/11/21 PHP
百度工程师讲PHP函数的实现原理及性能分析(三)
2015/05/13 PHP
PHP将Excel导入数据库及数据库数据导出至Excel的方法
2015/06/24 PHP
php实现简单的MVC框架实例
2015/09/23 PHP
PHP实现负载均衡的加权轮询方法分析
2018/08/22 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
JavaScript cookie的设置获取删除详解
2014/02/11 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
Node.js中对通用模块的封装方法
2014/06/06 Javascript
JQuery中serialize()、serializeArray()和param()方法示例介绍
2014/07/31 Javascript
jquery中使用循环下拉菜单示例代码
2014/09/24 Javascript
Node.js抓取中文网页乱码问题和解决方法
2015/02/10 Javascript
学习JavaScript设计模式之装饰者模式
2016/01/19 Javascript
AngularJS向后端ASP.NET API控制器上传文件
2016/02/03 Javascript
EasyUI Pagination 分页的两种做法小结
2016/07/09 Javascript
js使用xml数据载体实现城市省份二级联动效果
2017/11/08 Javascript
jQuery+CSS实现的标签页效果示例【测试可用】
2018/08/14 jQuery
vuex直接赋值的三种方法总结
2018/09/16 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
layui table表格数据的新增,修改,删除,查询,双击获取行数据方式
2019/11/14 Javascript
pymssql数据库操作MSSQL2005实例分析
2015/05/25 Python
python3编码问题汇总
2016/09/06 Python
Flask框架的学习指南之制作简单blog系统
2016/11/20 Python
Python  pip安装lxml出错的问题解决办法
2017/02/10 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
python脚本实现验证码识别
2018/06/07 Python
浅析Python函数式编程
2018/10/06 Python
python防止随意修改类属性的实现方法
2019/08/21 Python
原生python实现knn分类算法
2019/10/24 Python
Python安装tar.gz格式文件方法详解
2020/01/19 Python
CSS3中currentColor关键字的妙用
2016/02/27 HTML / CSS
css position fixed 左右双定位的实现代码
2021/04/29 HTML / CSS
一篇文章带你搞懂Python类的相关知识
2021/05/20 Python