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 del()函数用法
Mar 24 Python
在Python中使用sort()方法进行排序的简单教程
May 21 Python
Python基础教程之正则表达式基本语法以及re模块
Mar 25 Python
JS设计模式之责任链模式实例详解
Feb 03 Python
Python面向对象之接口、抽象类与多态详解
Aug 27 Python
selenium python 实现基本自动化测试的示例代码
Feb 25 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
使用Python的datetime库处理时间(RPA流程)
Nov 24 Python
Python如何对齐字符串
Jul 30 Python
如何利用pycharm进行代码更新比较
Nov 04 Python
Django通过设置CORS解决跨域问题
Nov 26 Python
详细总结Python常见的安全问题
May 21 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调用Webservice实例代码
2011/07/29 PHP
百度地图API使用方法详解
2015/08/25 PHP
实现复选框全选/全不选切换
2006/12/23 Javascript
jQuery ctrl+Enter shift+Enter实现代码
2010/02/07 Javascript
禁用Enter键表单自动提交实现代码
2014/05/22 Javascript
JavaScript实现复制或剪切内容到剪贴板功能的方法
2016/05/23 Javascript
javascript实现随机生成DIV背景色
2016/06/20 Javascript
总结几道关于Node.js的面试问题
2017/01/11 Javascript
nodejs 实现钉钉ISV接入的加密解密方法
2017/01/16 NodeJs
JS条形码(一维码)插件JsBarcode用法详解【编码类型、参数、属性】
2017/04/19 Javascript
jQuery Ajax async=&gt;false异步改为同步时,解决导致浏览器假死的问题
2019/07/22 jQuery
layui(1.0.9)文件上传upload,前后端的实例代码
2019/09/26 Javascript
vue实现表格过滤功能
2019/09/27 Javascript
Vue实例的对象参数options的几个常用选项详解
2019/11/08 Javascript
Js代码中的span拼接问题解决
2019/11/22 Javascript
[01:13:08]2018DOTA2亚洲邀请赛4.6 淘汰赛 mineski vs LGD 第二场
2018/04/10 DOTA
零基础写python爬虫之抓取百度贴吧代码分享
2014/11/06 Python
Python工程师面试题 与Python Web相关
2016/01/14 Python
Python实现向服务器请求压缩数据及解压缩数据的方法示例
2017/06/09 Python
Python3中类、模块、错误与异常、文件的简易教程
2017/11/20 Python
Python3显示当前时间、计算时间差及时间加减法示例代码
2019/09/07 Python
Python while循环使用else语句代码实例
2020/02/07 Python
python 数据分析实现长宽格式的转换
2020/05/18 Python
python实现密码验证合格程序的思路详解
2020/06/01 Python
Python装饰器结合递归原理解析
2020/07/02 Python
python如何操作mysql
2020/08/17 Python
HTML5时代CSS设置漂亮字体取代图片
2014/09/04 HTML / CSS
几个MySql的面试题
2013/04/22 面试题
酒吧创业计划书
2014/01/18 职场文书
企业文化理念标语
2014/06/10 职场文书
工程部岗位职责范本
2015/04/11 职场文书
大学学生会辞职信
2015/05/13 职场文书
2016圣诞节贺卡寄语
2015/12/07 职场文书
会计入职心得体会
2016/01/22 职场文书
导游词之广州陈家祠
2019/10/21 职场文书
十大最强火系宝可梦,喷火龙上榜,第一名有双火属性
2022/03/18 日漫