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实现的百度贴吧网络爬虫实例
Apr 17 Python
Python中列表和元组的相关语句和方法讲解
Aug 20 Python
Python实现八大排序算法
Aug 13 Python
Python设计实现的计算器功能完整实例
Aug 18 Python
Python中Threading用法详解
Dec 27 Python
简单实现Python爬取网络图片
Apr 01 Python
python爬取cnvd漏洞库信息的实例
Feb 14 Python
详解Python:面向对象编程
Apr 10 Python
Python3.5模块的定义、导入、优化操作图文详解
Apr 27 Python
Python实现数值积分方式
Nov 20 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
Python文件操作模拟用户登陆代码实例
Jun 09 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性能的原理介绍
2012/09/05 PHP
php+mysqli实现批量执行插入、更新及删除数据的方法
2015/01/29 PHP
php实现36进制与10进制转换功能示例
2017/01/10 PHP
DLL+ ActiveX控件+WEB页面调用例子
2010/08/07 Javascript
19个很有用的 JavaScript库推荐
2011/06/27 Javascript
Js(JavaScript)中,弹出是或否的选择框示例(confirm用法的实例分析)
2013/07/09 Javascript
jQuery快速上手:写jQuery与直接写JS的区别详细解析
2013/08/26 Javascript
jquery 使用简明教程
2014/03/05 Javascript
javascript文本框内输入文字倒计数的方法
2015/02/24 Javascript
jQuery实现的多张图无缝滚动效果【测试可用】
2016/09/12 Javascript
ajax异步请求详解
2017/01/06 Javascript
jquery仿京东商品放大浏览页面
2017/06/06 jQuery
vue如何判断dom的class
2018/04/26 Javascript
JavaScript私有变量实例详解
2019/01/24 Javascript
jQuery实现提交表单时不提交隐藏div中input的方法
2019/10/08 jQuery
node使用request请求的方法
2019/12/20 Javascript
微信小程序vant弹窗组件的实现方式
2020/02/21 Javascript
vue实现一个获取按键展示快捷键效果的Input组件
2021/01/13 Vue.js
ajax jquery实现页面某一个div的刷新效果
2021/03/04 jQuery
[02:02:38]VG vs Mineski Supermajor 败者组 BO3 第一场 6.6
2018/06/07 DOTA
[36:45]TNC vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
python学习笔记--将python源文件打包成exe文件(pyinstaller)
2018/05/26 Python
Python设计模式之抽象工厂模式原理与用法详解
2019/01/15 Python
Python Excel vlookup函数实现过程解析
2020/06/22 Python
用python制作个视频下载器
2021/02/01 Python
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
一些常用的HTML5模式(pattern) 总结
2015/07/14 HTML / CSS
韩国演唱会订票网站:StubHub韩国
2019/01/17 全球购物
英国和世界各地预订便宜的酒店:LateRooms.com
2019/05/05 全球购物
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
应聘自荐信
2013/12/14 职场文书
学习雷锋活动总结
2014/04/29 职场文书
布达拉宫导游词
2015/02/02 职场文书
写给同学的新学期寄语
2015/02/27 职场文书
三好学生主要事迹怎么写
2015/11/03 职场文书
详解MySQL连接挂死的原因
2021/05/18 MySQL