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 10 Python
详解Python的Django框架中的Cookie相关处理
Jul 22 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
python编辑用户登入界面的实现代码
Jul 16 Python
win10 64bit下python NLTK安装教程
Sep 19 Python
python中比较两个列表的实例方法
Jul 04 Python
Tensorflow模型实现预测或识别单张图片
Jul 19 Python
超全Python图像处理讲解(多模块实现)
Apr 13 Python
基于python调用jenkins-cli实现快速发布
Aug 14 Python
Python中的tkinter库简单案例详解
Jan 22 Python
Python中三种花式打印的示例详解
Mar 19 Python
python pygame 开发五子棋双人对弈
May 02 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
phpMyAdmin链接MySql错误 个人解决方案
2009/12/28 PHP
具有时效性的php加密解密函数代码
2013/06/19 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
php从文件夹随机读取文件的方法
2015/06/01 PHP
PHP安装GeoIP扩展根据IP获取地理位置及计算距离的方法
2016/07/01 PHP
laravel框架select2多选插件初始化默认选中项操作示例
2020/02/18 PHP
可拖动窗口,附带鼠标控制渐变透明,开启关闭功能
2006/06/26 Javascript
JQuery自适应IFrame高度(支持嵌套 兼容IE,ff,safafi,chrome)
2011/03/28 Javascript
利用jQuery接受和处理xml数据的代码(.net)
2011/03/28 Javascript
浅析JQuery UI Dialog的样式设置问题
2013/12/18 Javascript
js调用iframe实现打印页面内容的方法
2014/03/04 Javascript
实现checkbox全选、反选、取消JavaScript小脚本异常
2014/04/10 Javascript
javascript使用switch case实现动态改变超级链接文字及地址
2014/12/16 Javascript
实现placeholder效果的方案汇总
2015/06/11 Javascript
jq实现左侧显示图片右侧文字滑动切换效果
2015/08/04 Javascript
深入理解js函数的作用域与this指向
2016/05/28 Javascript
关于数据与后端进行交流匹配(点亮星星)
2016/08/03 Javascript
详解使用Vue Router导航钩子与Vuex来实现后退状态保存
2017/09/11 Javascript
VuePress 静态网站生成方法步骤
2019/02/14 Javascript
js实现简单页面全屏
2019/09/17 Javascript
layui 上传插件 带预览 非自动上传功能的实例(非常实用)
2019/09/23 Javascript
python标准日志模块logging的使用方法
2013/11/01 Python
详解python之多进程和进程池(Processing库)
2017/06/09 Python
Django自定义manage命令实例代码
2018/02/11 Python
python爬取哈尔滨天气信息
2018/07/14 Python
python制作mysql数据迁移脚本
2019/01/01 Python
pandas的排序和排名的具体使用
2019/07/31 Python
tensorflow 模型权重导出实例
2020/01/24 Python
Python单链表原理与实现方法详解
2020/02/22 Python
css3实现多个元素依次显示效果
2017/12/12 HTML / CSS
温泉秘密:Onsen Secret
2020/07/06 全球购物
计算机科学系职业生涯规划书
2014/03/08 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
微信小程序实现录音Record功能
2021/05/09 Javascript
python pygame入门教程
2021/06/01 Python