Python实现双向链表基本操作


Posted in Python onMay 25, 2022

双向链表的基本操作的实现,供大家参考,具体内容如下

在之前的博客中介绍了三种链表,分别是单链表、单向循环链表以及双向链表。本篇博客将用Python来实现双向链表的如下操作。(用到的工具是Python 3)

is_empty() : 判断链表是否为空
length() : 返回链表的长度
travel() : 遍历
add(item) : 在头部添加一个节点
append(item) : 在尾部添加一个节点
insert(pos, item) : 在指定位置 pos 添加一个节点
remove(item) :  删除一个节点
search(item) :  查找节点是否存在

Python实现

class Node(object):
    '''双向链表节点'''
    def __init__(self,item):
        self.item = item
        self.next = None
        self.prev = None
class DoubleLink(object):
    '''双向链表'''
    def __init__(self):
        self._head = None
    
    def is_empty(self):
        '''判断是否为空'''
        return self._head == None
    
    def length(self):
        '''返回链表的长度'''
        cur = self._head
        count = 0
        while cur!= None:
            count += 1
            cur = cur.next
        return count
    
    def travel(self):
        '''遍历链表'''
        cur = self._head
        while cur != None:
            print(cur.item)
            cur = cur.next
        print("")
    
    def add(self, item):
        '''头部插入元素'''
        node = Node(item)
        if self.is_empty():
            # 如果是空链表,将_head指向None
            self._head = node
        else:
            # 将node的next指向_head的头节点
            node.next = self._head
            # 将_head的头节点的prev指向node
            self._head.prev = node
            # 将_head 指向node
            self._head = node
    
    def append(self, item):
        '''尾部插入元素'''
        node = Node(item)
        if self.is_empty():
            self._head = node
        else:
            # 移动到链表尾部
            cur = self._head
            while cur.next != None:
                cur = cur.next
            # 将尾结点cur的next指向node
            cur.next = node
            # 将node的prev指向cur
            node.prev = cur
    
    def search(self, item):
        '''查找元素是否存在'''
        cur = self._head
        while cur != None:
            if cur.item == item:
                return True
            cur = cur.next
        return False

指定位置插入节点

在该操作中,要注意链的指向的先后顺序。

Python实现双向链表基本操作

def insert(self, pos, item):
        '''在指定位置添加节点'''
        if pos <= 0:
            self.add(item)
        elif pos > (self.length() - 1):
            self.append(item)
        else:
            node = Node()
            cur = self._head()
            count = 0
            # 移动到指定的前一个位置
            while cur < pos - 1 :
                count += 1
                cur = cur.next
            # 将node的prev指向cur
            node.prev = cur
            # 将node的next指向cur的下一个节点
            node.next = cur.next
            # 将cur的下一个节点的prev指向node
            cur.next.prev = node
            # 将cur.next指向node
            cur.next = node

删除元素

Python实现双向链表基本操作

def remove(self, item):
        '''删除元素'''
        if self.is_empty(): return 
        else:
            cur = self._head
            if cur.item == item:
                # 如果首节点的元素是要删除的元素
                if cur.next == None:
                    # 如果链表中只有一个节点
                    self._head = None
                else:
                    cur.next.prev = None
                    self._head = cur.next
                return
            while cur != None:
                if cur.item == item:
                    cur.prev.next = cur.next
                    cur.next.prev = cur.prev
                    break
                cur = cur.next

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
python中的对象拷贝示例 python引用传递
Jan 23 Python
解决Python中字符串和数字拼接报错的方法
Oct 23 Python
Python判断文件和字符串编码类型的实例
Dec 21 Python
python reverse反转部分数组的实例
Dec 13 Python
详解Python网络框架Django和Scrapy安装指南
Apr 01 Python
selenium 安装与chromedriver安装的方法步骤
Jun 12 Python
基于Python的图像数据增强Data Augmentation解析
Aug 13 Python
PythonPC客户端自动化实现原理(pywinauto)
May 28 Python
python 实现图像快速替换某种颜色
Jun 04 Python
Python 连接 MySQL 的几种方法
Sep 09 Python
python em算法的实现
Oct 03 Python
Python连续赋值需要注意的一些问题
Jun 03 Python
python实现双向链表原理
May 25 #Python
Python代码实现双链表
详解NumPy中的线性关系与数据修剪压缩
python实现双链表
May 25 #Python
Python实现双向链表
May 25 #Python
python区块链持久化和命令行接口实现简版
May 25 #Python
python区块链实现简版工作量证明
May 25 #Python
You might like
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
PHP中几种常见的超时处理全面总结
2012/09/11 PHP
捕获关闭窗口的脚本
2009/01/10 Javascript
js 判断 enter 事件
2009/02/12 Javascript
详解jquery uploadify 上传文件
2013/11/09 Javascript
jQuery分别获取选中的复选框值的示例
2014/06/17 Javascript
JavaScript中判断整字类型最简洁的实现方法
2014/11/08 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
正则表达式优化JSON字符串的技巧
2015/12/24 Javascript
Bootstrap Navbar Component实现响应式导航
2016/10/08 Javascript
javascript中this关键字详解
2016/12/12 Javascript
浅谈vue项目重构技术要点和总结
2018/01/23 Javascript
Babel 入门教程学习笔记
2018/06/13 Javascript
浅谈vue首屏加载优化
2018/06/28 Javascript
原生js实现商品筛选功能
2019/10/28 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
python实现哈希表
2014/02/07 Python
Python求解平方根的方法
2015/03/11 Python
python中安装Scrapy模块依赖包汇总
2017/07/02 Python
python pandas 组内排序、单组排序、标号的实例
2018/04/12 Python
python selenium 获取标签的属性值、内容、状态方法
2018/06/22 Python
Python 50行爬虫抓取并处理图灵书目过程详解
2019/09/20 Python
使用Pandas将inf, nan转化成特定的值
2019/12/19 Python
Django跨域资源共享问题(推荐)
2020/03/09 Python
matplotlib教程——强大的python作图工具库
2020/10/15 Python
记一次python 爬虫爬取深圳租房信息的过程及遇到的问题
2020/11/24 Python
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
UNIX文件系统分类
2014/11/11 面试题
行政总监岗位职责
2013/12/05 职场文书
承诺书格式
2014/06/03 职场文书
关爱老人标语
2014/06/21 职场文书
学习朴航瑛老师爱岗敬业先进事迹思想汇报
2014/09/17 职场文书
高三毕业评语
2014/12/31 职场文书
人事行政助理岗位职责
2015/04/11 职场文书
2015年中秋放假通知范文
2015/08/18 职场文书
Windows和Linux上部署Golang并运行程序
2022/04/22 Servers