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入门篇之条件、循环
Oct 17 Python
Ubuntu安装Jupyter Notebook教程
Oct 18 Python
基于python中theano库的线性回归
Aug 31 Python
用python实现k近邻算法的示例代码
Sep 06 Python
关于Python内存分配时的小秘密分享
Sep 05 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
基于python实现微信好友数据分析(简单)
Feb 16 Python
Python调用接口合并Excel表代码实例
Mar 31 Python
Python MOCK SERVER moco模拟接口测试过程解析
Apr 13 Python
Pycharm无法打开双击没反应的问题及解决方案
Aug 17 Python
一个入门级python爬虫教程详解
Jan 27 Python
python人工智能human learn绘图可创建机器学习模型
Nov 23 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代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
php实现的生成排列算法示例
2019/07/25 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
解决laravel session失效的问题
2019/10/14 PHP
火狐4、谷歌12不支持Jquery Validator的解决方法分享
2011/06/20 Javascript
js原型链原理看图说明
2012/07/07 Javascript
js判断页面中是否有指定控件的简单实例
2014/03/04 Javascript
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
全面解析Bootstrap中tooltip、popover的使用方法
2016/06/13 Javascript
Javascript中的神器——Promise
2017/02/08 Javascript
layui框架中layer父子页面交互的方法分析
2017/11/15 Javascript
Vue2.0 实现单选互斥的方法
2018/04/13 Javascript
js中对象与对象创建方法的各种方法
2019/02/27 Javascript
layui表格 列自动适应大小失效的解决方法
2019/09/06 Javascript
addEventListener()和removeEventListener()追加事件和删除追加事件
2020/12/04 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
python多线程编程中的join函数使用心得
2014/09/02 Python
将Emacs打造成强大的Python代码编辑工具
2015/11/20 Python
Python常见排序操作示例【字典、列表、指定元素等】
2018/08/15 Python
Python检查和同步本地时间(北京时间)的实现方法
2018/12/03 Python
Python3.5内置模块之random模块用法实例分析
2019/04/26 Python
什么是python的id函数
2020/06/11 Python
HTML5 progress和meter控件_动力节点Java学院整理
2017/07/06 HTML / CSS
意大利高端时尚买手店:Stefania Mode
2018/03/01 全球购物
开普敦通行证:Cape Town Pass
2019/07/18 全球购物
Tuckernuck官网:经典的美国品质服装、鞋子和配饰
2021/01/11 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
优秀的教师个人的中文求职信
2013/09/21 职场文书
致百米运动员广播稿
2014/01/29 职场文书
公务员培的训心得体会
2014/09/01 职场文书
小区保洁员岗位职责
2015/04/10 职场文书
2015教师节通讯稿
2015/07/20 职场文书
2015年新教师个人工作总结
2015/10/14 职场文书
职场中的你,辞职信写对了吗?
2019/06/26 职场文书
Spring-cloud Config Server的3种配置方式
2021/09/25 Java/Android