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使用稀疏矩阵节省内存实例
Jun 27 Python
Python与shell的3种交互方式介绍
Apr 11 Python
解决Python2.7中IDLE启动没有反应的问题
Nov 30 Python
nohup后台启动Python脚本,log不刷新的解决方法
Jan 14 Python
Dlib+OpenCV深度学习人脸识别的方法示例
May 14 Python
Python中实现输入超时及如何通过变量获取变量名
Jan 18 Python
Python操作Excel工作簿的示例代码(\*.xlsx)
Mar 23 Python
Python3 io文本及原始流I/O工具用法详解
Mar 23 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
python3爬虫中引用Queue的实例讲解
Nov 24 Python
python中entry用法讲解
Dec 04 Python
python爬虫scrapy框架的梨视频案例解析
Feb 20 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
《DOTA3》开发工作已经开始 《DOTA3》将代替《DOTA2》
2021/03/06 DOTA
javascript 小型动画组件与实现代码
2010/06/02 PHP
PHP 第一节 php简介
2012/04/28 PHP
Thinkphp实现短信验证注册功能
2016/10/18 PHP
PHP的RSA加密解密方法以及开发接口使用
2018/02/11 PHP
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
ie支持function.bind()方法实现代码
2012/12/27 Javascript
JavaScript 中的日期和时间及表示标准介绍
2013/08/21 Javascript
js加密解密字符串可自定义密码因子
2014/05/13 Javascript
NodeJS学习笔记之MongoDB模块
2015/01/13 NodeJs
EasyUI创建对话框的两种方式
2016/08/23 Javascript
Bootstrap基本布局实现方法详解
2016/11/25 Javascript
小程序实现多个选项卡切换
2020/06/19 Javascript
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
python面向对象入门教程之从代码复用开始(一)
2018/12/11 Python
关于python下cv.waitKey无响应的原因及解决方法
2019/01/10 Python
Python字符串匹配之6种方法的使用详解
2019/04/08 Python
python json.dumps() json.dump()的区别详解
2020/07/14 Python
Python3如何使用range函数替代xrange函数
2020/10/05 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
HTML5 Canvas绘制五星红旗
2016/05/04 HTML / CSS
Foot Locker德国官方网站:美国运动服和鞋类零售商
2018/11/01 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
小学语文教学反思
2014/02/10 职场文书
普通简短的个人自我评价
2014/02/15 职场文书
美丽乡村建设实施方案
2014/03/23 职场文书
《有趣的发现》教学反思
2014/04/15 职场文书
竞争与合作演讲稿
2014/05/12 职场文书
保护黄河倡议书
2014/05/16 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
英文升职感谢信
2015/01/23 职场文书
《家世》读后感:看家训的力量
2019/12/30 职场文书
python使用pywinauto驱动微信客户端实现公众号爬虫
2021/05/19 Python