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打开url并按指定块读取网页内容的方法
Apr 29 Python
python监控文件或目录变化
Jun 07 Python
Python tkinter的grid布局及Text动态显示方法
Oct 11 Python
详解Python requests 超时和重试的方法
Dec 18 Python
对python中if语句的真假判断实例详解
Feb 18 Python
python使用pipeline批量读写redis的方法
Feb 18 Python
深入了解Python iter() 方法的用法
Jul 11 Python
Tensorflow实现神经网络拟合线性回归
Jul 19 Python
Python字典推导式将cookie字符串转化为字典解析
Aug 10 Python
python对象销毁实例(垃圾回收)
Jan 16 Python
pytorch实现建立自己的数据集(以mnist为例)
Jan 18 Python
使用Selenium实现微博爬虫(预登录、展开全文、翻页)
Apr 13 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
CodeIgniter实现从网站抓取图片并自动下载到文件夹里的方法
2015/06/17 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
javascript下数值型比较难点说明
2010/06/07 Javascript
javaScript让文本框内的最后一个文字的后面获得焦点实现代码
2013/01/06 Javascript
jquery+css+ul模拟列表菜单具体实现思路
2013/04/15 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
分享十五款 jQuery 社交网络分享插件
2015/05/16 Javascript
使用jQuery加载html页面到指定的div实现方法
2016/07/13 Javascript
Bootstrap精简教程中秋大放送
2016/09/15 Javascript
JavaScript编写一个简易购物车功能
2016/09/17 Javascript
详解用webpack2搭建angular2的项目
2017/06/22 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
jquery.onoff实现简单的开关按钮功能(推荐)
2018/05/24 jQuery
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
详解VScode编辑器vue环境搭建所遇问题解决方案
2019/04/26 Javascript
html2canvas属性和使用方法以及如何使用html2canvas将HTML内容写入Canvas生成图片
2020/01/12 Javascript
python使用三角迭代计算圆周率PI的方法
2015/03/20 Python
Python基于scrapy采集数据时使用代理服务器的方法
2015/04/16 Python
python编写分类决策树的代码
2017/12/21 Python
解决tensorflow1.x版本加载saver.restore目录报错的问题
2018/07/26 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
详解用python写一个抽奖程序
2019/05/10 Python
django与vue的完美结合_实现前后端的分离开发之后在整合的方法
2019/08/12 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
Django bulk_create()、update()与数据库事务的效率对比分析
2020/05/15 Python
python热力图实现简单方法
2021/01/29 Python
纯CSS实现的大小渐变、渐远效果
2014/04/15 HTML / CSS
html5的websockets全双工通信详解学习示例
2014/02/26 HTML / CSS
Foot Locker澳洲官网:美国运动服和鞋类零售商
2019/10/11 全球购物
高级文秘工作总结的自我评价
2013/09/28 职场文书
环境科学专业个人求职的自我评价
2013/11/28 职场文书
企业申诉管理制度
2014/01/30 职场文书
无私奉献演讲稿
2014/09/04 职场文书
2015年元旦联欢晚会活动总结
2014/11/28 职场文书
解决tk mapper 通用mapper的bug问题
2021/06/16 Java/Android