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装饰器初探(推荐)
Jul 21 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
Python多进程multiprocessing用法实例分析
Aug 18 Python
python解析html提取数据,并生成word文档实例解析
Jan 22 Python
TensorFlow实现简单卷积神经网络
May 24 Python
使用pandas read_table读取csv文件的方法
Jul 04 Python
利用pandas合并多个excel的方法示例
Oct 10 Python
python随机模块random的22种函数(小结)
May 15 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
keras 指定程序在某块卡上训练实例
Jun 22 Python
什么是Python包的循环导入
Sep 08 Python
Python四款GUI图形界面库介绍
Jun 05 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函数之error_reporting(E_ALL ^ E_NOTICE)详细说明
2011/07/01 PHP
让codeigniter与swfupload整合的最佳解决方案
2014/06/12 PHP
百度实时推送api接口应用示例
2014/10/21 PHP
php随机显示指定文件夹下图片的方法
2015/07/13 PHP
解析WordPress中函数钩子hook的作用及基本用法
2015/12/22 PHP
PHP Beanstalkd消息队列的安装与使用方法实例详解
2020/02/21 PHP
JQuery 获得绝对,相对位置的坐标方法
2010/02/09 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
js倒计时小程序
2013/11/05 Javascript
jquery操作cookie插件分享
2014/01/14 Javascript
JS中数组Array的用法示例介绍
2014/02/20 Javascript
JavaScript代码编写中各种各样的坑和填坑方法
2014/06/06 Javascript
js进行表单验证实例分析
2015/02/10 Javascript
Jquery和BigFileUpload实现大文件上传及进度条显示
2016/06/27 Javascript
vue watch监听对象及对应值的变化详解
2018/02/24 Javascript
学习JS中的DOM节点以及操作
2018/04/30 Javascript
vue组件之间的数据传递方法详解
2019/04/19 Javascript
详解微信小程序开发用户授权登陆
2019/04/24 Javascript
vue App.vue中的公共组件改变值触发其他组件或.vue页面监听
2019/05/31 Javascript
Python有序字典简单实现方法示例
2017/09/28 Python
Python IDLE入门简介
2017/12/08 Python
python+opencv实现动态物体追踪
2018/01/09 Python
torch 中各种图像格式转换的实现方法
2019/12/26 Python
基于python实现ROC曲线绘制广场解析
2020/06/28 Python
Django model class Meta原理解析
2020/11/14 Python
利用promise及参数解构封装ajax请求的方法
2021/03/24 Javascript
乡镇个人对照检查材料
2014/08/22 职场文书
公司出纳岗位职责
2015/03/31 职场文书
小时代观后感
2015/06/10 职场文书
婚庆答谢词大全
2015/09/29 职场文书
区域销售大会开幕词
2016/03/04 职场文书
《我在为谁工作》:工作的质量往往决定生活的质量
2019/12/27 职场文书
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
一文弄懂MySQL索引创建原则
2022/02/28 MySQL
公历12个月名称的由来
2022/04/12 杂记
springboot 全局异常处理和统一响应对象的处理方式
2022/06/28 Java/Android