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 连连看连接算法
Nov 22 Python
Python中的面向对象编程详解(上)
Apr 13 Python
解析Python中的异常处理
Apr 28 Python
Python的地形三维可视化Matplotlib和gdal使用实例
Dec 09 Python
python绘制双柱形图代码实例
Dec 14 Python
selenium python浏览器多窗口处理代码示例
Jan 15 Python
对Python Class之间函数的调用关系详解
Jan 23 Python
python初学者,用python实现基本的学生管理系统(python3)代码实例
Apr 10 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
使用python模拟命令行终端的示例
Aug 13 Python
python 多进程并行编程 ProcessPoolExecutor的实现
Oct 11 Python
Python监听键盘和鼠标事件的示例代码
Nov 18 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通过session防url攻击方法
2014/12/10 PHP
php中http与https跨域共享session的解决方法
2014/12/20 PHP
ThinkPHP使用Ueditor的方法详解
2016/05/20 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
jquery中.add()的使用分析
2013/04/26 Javascript
简述JavaScript对传统文档对象模型的支持
2015/06/16 Javascript
举例讲解Node.js中的Writable对象
2015/07/29 Javascript
javascript先序遍历DOM树的方法
2016/02/27 Javascript
Bootstrap3制作搜索框样式的方法
2016/07/11 Javascript
文件上传插件SWFUpload的使用指南
2016/11/29 Javascript
解决bootstrap模态框数据缓存的问题方法
2018/08/10 Javascript
原生javascript实现连连看游戏
2019/01/03 Javascript
jQuery each和js forEach用法比较
2019/02/27 jQuery
layer.js open 隐藏滚动条的例子
2019/09/05 Javascript
JS访问对象两种方式区别解析
2020/08/29 Javascript
[01:10]3.19DOTA2发布会 三代刀塔人第一代
2014/03/25 DOTA
在Python中处理字符串之isdigit()方法的使用
2015/05/18 Python
Python中用字符串调用函数或方法示例代码
2017/08/04 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
聊聊python里如何用Borg pattern实现的单例模式
2019/06/06 Python
python构造函数init实例方法解析
2020/01/19 Python
pandas的resample重采样的使用
2020/04/24 Python
python集合能干吗
2020/07/19 Python
python3将变量输入的简单实例
2020/08/19 Python
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
俄罗斯三星品牌商店:GalaxyStore
2020/11/04 全球购物
请解释流与文件有什么不同
2016/07/29 面试题
如何写好优秀的创业计划书
2014/01/30 职场文书
经典团队口号
2014/06/06 职场文书
公司领导班子召开党的群众路线教育实践活动总结大会新闻稿
2014/10/21 职场文书
中考学习决心书
2015/02/04 职场文书
2015清明节祭奠英烈寄语大全
2015/03/04 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
springboot集成springCloud中gateway时启动报错的解决
2021/07/16 Java/Android