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使用Berkeley DB数据库实例
Sep 26 Python
Python实现把数字转换成中文
Jun 29 Python
Python中的默认参数实例分析
Jan 29 Python
对python .txt文件读取及数据处理方法总结
Apr 23 Python
Python使用cx_Oracle模块操作Oracle数据库详解
May 07 Python
Python实现的tcp端口检测操作示例
Jul 24 Python
python区分不同数据类型的方法
Oct 14 Python
如何使用repr调试python程序
Feb 28 Python
python画图常规设置方式
Mar 05 Python
Tensorflow加载Vgg预训练模型操作
May 26 Python
使用tensorflow实现VGG网络,训练mnist数据集方式
May 26 Python
python Gabor滤波器讲解
Oct 26 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获取某个目录大小的代码
2008/09/10 PHP
php ss7.5的数据调用 (笔记)
2010/03/08 PHP
php实现根据词频生成tag云的方法
2015/04/17 PHP
PHP之浮点数计算比较以及取整数不准确的解决办法
2015/07/29 PHP
使用正则替换变量
2007/05/05 Javascript
js 发个判断字符串是否为符合标准的函数
2009/04/27 Javascript
js 有框架页面跳转(target)三种情况下的应用
2013/04/09 Javascript
JS中showModalDialog 的使用解析
2013/04/17 Javascript
自制的文件上传JS控件可支持IE、chrome、firefox etc
2014/04/18 Javascript
很棒的js选项卡切换效果
2016/07/15 Javascript
基于MVC5和Bootstrap的jQuery TreeView树形控件(一)之数据支持json字符串、list集合
2016/08/11 Javascript
JS短信验证码倒计时功能的实现(没有验证码,只有倒计时)
2016/10/27 Javascript
快速掌握jquery分页插件jqPaginator的使用方法
2017/08/09 jQuery
Nodejs中获取当前函数被调用的行数及文件名详解
2018/12/12 NodeJs
vue-router 路由传参用法实例分析
2020/03/06 Javascript
Bootstrap实现前端登录页面带验证码功能完整示例
2020/03/26 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
微信小程序实现自定义动画弹框/提示框的方法实例
2020/11/06 Javascript
python检测远程udp端口是否打开的方法
2015/03/14 Python
在Python中使用next()方法操作文件的教程
2015/05/24 Python
Python中操作文件之write()方法的使用教程
2015/05/25 Python
Python批量重命名同一文件夹下文件的方法
2015/05/25 Python
python3去掉string中的标点符号方法
2019/01/22 Python
python制作图片缩略图
2019/04/30 Python
Django如何自定义model创建数据库索引的顺序
2019/06/20 Python
pyqt5 删除layout中的所有widget方法
2019/06/25 Python
python @classmethod 的使用场合详解
2019/08/23 Python
TFRecord文件查看包含的所有Features代码
2020/02/17 Python
Python爬虫自动化爬取b站实时弹幕实例方法
2021/01/26 Python
宝塔面板出现“open_basedir restriction in effect. ”的解决方法
2021/03/14 PHP
CSS3教程(8):CSS3透明度指南
2009/04/02 HTML / CSS
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
物业客服专员岗位职责
2013/11/30 职场文书
应届大学生自荐信
2013/12/05 职场文书
新员工考核评语
2014/12/31 职场文书
教代会闭幕词
2015/01/28 职场文书