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使用urllib模块和pyquery实现阿里巴巴排名查询
Jan 16 Python
Python素数检测的方法
May 11 Python
wxPython中listbox用法实例详解
Jun 01 Python
PyGame贪吃蛇的实现代码示例
Nov 21 Python
Python 50行爬虫抓取并处理图灵书目过程详解
Sep 20 Python
python导入不同目录下的自定义模块过程解析
Nov 18 Python
python构建指数平滑预测模型示例
Nov 21 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
python高阶函数map()和reduce()实例解析
Mar 16 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
Jun 28 Python
Python lxml库的简单介绍及基本使用讲解
Dec 22 Python
全网最详细的PyCharm+Anaconda的安装过程图解
Jan 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/10/11 PHP
PHP设计模式之装饰者模式
2012/02/29 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
PHP MVC框架路由学习笔记
2016/03/02 PHP
PHP信号处理机制的操作代码讲解
2019/04/19 PHP
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
javascript中的作用域和上下文使用简要概述
2013/12/05 Javascript
jQuery选择器全集详解
2014/11/24 Javascript
node.js中的定时器nextTick()和setImmediate()区别分析
2014/11/26 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
jquery插件jSignature实现手动签名
2015/05/04 Javascript
jquery点击缩略图切换视频播放特效代码分享
2015/09/15 Javascript
JavaScript计划任务后台运行的方法
2015/12/18 Javascript
jquery插件格式实例分析
2016/06/16 Javascript
JS使用cookie实现只出现一次的广告代码效果
2017/04/22 Javascript
jquery replace方法去空格
2017/05/08 jQuery
JS实现的走迷宫小游戏完整实例
2017/07/19 Javascript
Angular4编程之表单响应功能示例
2017/12/13 Javascript
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
Vue基础配置讲解
2019/11/29 Javascript
浅析微信小程序自定义日历组件及flex布局最后一行对齐问题
2020/10/29 Javascript
python基础教程之常用运算符
2014/08/29 Python
python基础教程之Filter使用方法
2017/01/17 Python
如何使用pyinstaller打包32位的exe程序
2019/05/26 Python
如何快速一次性卸载所有python包(第三方库)呢
2020/10/20 Python
python3中数组逆序输出方法
2020/12/01 Python
CSS3实现可爱的小黄人动画
2016/07/11 HTML / CSS
卡拉威高尔夫官方网站:Callaway Golf
2020/09/16 全球购物
什么是反射
2012/03/17 面试题
护理中职生求职信范文
2014/02/24 职场文书
大三学生做职业规划:给未来找个方向
2014/02/24 职场文书
《世界多美呀》教学反思
2014/03/02 职场文书
活动总结新闻稿
2014/08/30 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
导游词之秦始皇兵马俑博物馆
2019/09/29 职场文书
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫