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代码打包为jar软件的简单方法
Aug 04 Python
Python解析json之ValueError: Expecting property name enclosed in double quotes: line 1 column 2(char 1)
Jul 06 Python
Python简单定义与使用字典dict的方法示例
Jul 25 Python
Python3 处理JSON的实例详解
Oct 29 Python
在Mac下使用python实现简单的目录树展示方法
Nov 01 Python
Python3 max()函数基础用法
Feb 19 Python
python3.5 cv2 获取视频特定帧生成jpg图片
Aug 28 Python
Pytorch在dataloader类中设置shuffle的随机数种子方式
Jan 14 Python
Python TKinter如何自动关闭主窗口
Feb 26 Python
解决tensorflow/keras时出现数组维度不匹配问题
Jun 29 Python
基于Python实现简单学生管理系统
Jul 24 Python
Pytorch GPU内存占用很高,但是利用率很低如何解决
Jun 01 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中extract()函数的定义和用法
2012/08/17 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
php文件上传类完整实例
2016/05/14 PHP
PHP实现的观察者模式实例
2017/06/21 PHP
PHP数组Key强制类型转换实现原理解析
2020/09/01 PHP
JQuery 学习笔记 选择器之五
2009/07/23 Javascript
js parentElement和offsetParent之间的区别
2010/03/23 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
jquery UI Datepicker时间控件的使用方法(加强版)
2015/11/07 Javascript
JavaScript的==运算详解
2016/07/20 Javascript
AngularJS bootstrap启动详解及实例代码
2016/09/14 Javascript
jQuery grep()方法详解及实例代码
2016/10/30 Javascript
easyui-combobox 实现简单的自动补全功能示例
2016/11/08 Javascript
JavaScript在form表单中使用button按钮实现submit提交方法
2017/01/23 Javascript
jQuery实现div跟随鼠标移动
2020/08/20 jQuery
防止页面url缓存中ajax中post请求的处理方法
2017/10/10 Javascript
Bootstrap 模态框多次显示后台提交多次BUG的解决方法
2017/12/26 Javascript
微信小程序下拉框组件使用方法详解
2018/12/28 Javascript
jQuery AJAX与jQuery事件的分析讲解
2019/02/18 jQuery
vue全局自定义指令-元素拖拽的实现代码
2019/04/14 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
python 图片验证码代码分享
2012/07/04 Python
python处理PHP数组文本文件实例
2014/09/18 Python
Python变量作用范围实例分析
2015/07/07 Python
Python如何为图片添加水印
2016/11/25 Python
对Python 窗体(tkinter)文本编辑器(Text)详解
2018/10/11 Python
Python 使用 PyQt5 开发的关机小工具分享
2020/07/16 Python
Windows 平台做 Python 开发的最佳组合(推荐)
2020/07/27 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
字符串str除首尾字符外的其他字符按升序排列
2013/03/08 面试题
C和C++经典笔试题附答案解析
2014/08/18 面试题
生产副总岗位职责
2013/11/28 职场文书
擅自离岗检讨书
2014/02/11 职场文书
刑事附带民事代理词
2015/05/25 职场文书
2016春季校长开学典礼致辞
2015/11/26 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书