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 k-近邻算法实例分享
Jun 11 Python
Python实现对比不同字体中的同一字符的显示效果
Apr 23 Python
Python栈算法的实现与简单应用示例
Nov 01 Python
ubuntu中配置pyqt4环境教程
Dec 27 Python
Python Pandas 获取列匹配特定值的行的索引问题
Jul 01 Python
Python函数的返回值、匿名函数lambda、filter函数、map函数、reduce函数用法实例分析
Dec 26 Python
Python with标签使用方法解析
Jan 17 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
如何基于python对接钉钉并获取access_token
Apr 21 Python
python 匿名函数与三元运算学习笔记
Oct 23 Python
5道关于python基础 while循环练习题
Nov 27 Python
python如何读取和存储dict()与.json格式文件
Jun 25 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 表单验证实现代码
2009/03/10 PHP
PHP 5.3.0 安装分析心得
2009/08/07 PHP
使用session判断用户登录用户权限(超简单)
2013/06/08 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
ThinkPHP5&amp;5.1实现验证码的生成、使用及点击刷新功能示例
2020/02/07 PHP
TextArea不支持maxlength的解决办法(jquery)
2011/09/13 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
一个JavaScript防止表单重复提交的实例
2014/10/21 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
浅析Nodejs npm常用命令
2016/06/14 NodeJs
正则表达式替换html元素属性的方法
2016/11/26 Javascript
微信小程序 自定义消息提示框
2017/08/06 Javascript
Vue v2.4中新增的$attrs及$listeners属性使用教程
2018/01/08 Javascript
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
Vue基本指令实例图文讲解
2021/02/25 Vue.js
[01:04:49]KG vs LGD 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
python读取word文档的方法
2015/05/09 Python
尝试使用Python多线程抓取代理服务器IP地址的示例
2015/11/09 Python
浅谈Python实现2种文件复制的方法
2018/01/19 Python
Python实现的质因式分解算法示例
2018/05/03 Python
Django实现CAS+OAuth2的方法示例
2019/10/30 Python
用python爬取历史天气数据的方法示例
2019/12/30 Python
升级keras解决load_weights()中的未定义skip_mismatch关键字问题
2020/06/12 Python
win10安装python3.6的常见问题
2020/07/01 Python
机电专业大学生求职信
2013/10/04 职场文书
土木工程个人自荐信范文
2013/11/30 职场文书
费用会计岗位职责
2014/01/01 职场文书
自动一体化专业求职信
2014/03/15 职场文书
报告会主持词
2014/04/02 职场文书
爱的奉献演讲稿
2014/09/10 职场文书
劳资员岗位职责
2015/02/13 职场文书
证婚人致辞精选
2015/07/28 职场文书
小学感恩主题班会
2015/08/12 职场文书
浅谈Python数学建模之线性规划
2021/06/23 Python
Redis集群的关闭与重启操作
2021/07/07 Redis