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内置数据类型详解
Aug 18 Python
Python获取DLL和EXE文件版本号的方法
Mar 10 Python
Python的Flask站点中集成xhEditor文本编辑器的教程
Jun 13 Python
python爬虫headers设置后无效的解决方法
Oct 21 Python
Python实现绘制双柱状图并显示数值功能示例
Jun 23 Python
详解python里的命名规范
Jul 16 Python
Python 中包/模块的 `import` 操作代码
Apr 22 Python
通过python实现弹窗广告拦截过程详解
Jul 10 Python
pytorch绘制并显示loss曲线和acc曲线,LeNet5识别图像准确率
Jan 02 Python
Django分页器的用法你都了解吗
May 26 Python
解决Python字典查找报Keyerror的问题
May 26 Python
一文搞懂Python Sklearn库使用
Aug 23 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 关于访问控制的和运算符优先级介绍
2013/07/08 PHP
PHP文件上传主要代码讲解
2013/09/30 PHP
PHP多种序列化/反序列化的方法详解
2017/06/23 PHP
Jquery Ajax.ashx 高效分页实现代码
2009/10/20 Javascript
使用jQuery向asp.net Mvc传递复杂json数据-ModelBinder篇
2010/05/07 Javascript
jquery中实现标签切换效果的代码
2011/03/01 Javascript
javascript面向对象编程代码
2011/12/19 Javascript
jquery 事件冒泡的介绍以及如何阻止事件冒泡
2012/12/25 Javascript
JS简单操作select和dropdownlist实例
2014/11/26 Javascript
javascript针对cookie的基本操作实例详解
2015/11/30 Javascript
JavaScript+html5 canvas制作色彩斑斓的正方形效果
2016/01/27 Javascript
基于jquery实现表格内容筛选功能实例解析
2016/05/09 Javascript
JavaScript SHA-256加密算法详细代码
2016/10/06 Javascript
基于jQuery实现Accordion手风琴自定义插件
2020/10/13 Javascript
原生JS 购物车及购物页面的cookie使用方法
2017/08/21 Javascript
vue2手机APP项目添加开屏广告或者闪屏广告
2017/11/28 Javascript
解决Vue开发中对话框被遮罩层挡住的问题
2018/11/26 Javascript
[01:20]PWL开团时刻DAY9——听说潮汐没用?
2020/11/10 DOTA
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
Python下使用Scrapy爬取网页内容的实例
2018/05/21 Python
详解Python中is和==的区别
2019/03/21 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
jupyter实现重新加载模块
2020/04/16 Python
Python的scikit-image模块实例讲解
2020/12/30 Python
python中操作文件的模块的方法总结
2021/02/04 Python
css3 响应式媒体查询的示例代码
2019/09/25 HTML / CSS
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
基于html和CSS3制作酷炫的导航栏
2015/09/23 HTML / CSS
Html5实现用户注册自动校验功能实例代码
2016/05/24 HTML / CSS
char型变量中能不能存贮一个中文汉字
2015/07/08 面试题
一些Solaris面试题
2015/12/22 面试题
会计学个人自荐信模板
2013/12/13 职场文书
光盘行动倡议书
2014/02/02 职场文书
专升本学生毕业自我鉴定
2014/10/04 职场文书
2014年库房工作总结
2014/11/26 职场文书
运动会表扬稿
2015/01/16 职场文书