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实现的一个找零钱的小程序代码分享
Aug 25 Python
跟老齐学Python之有容乃大的list(2)
Sep 15 Python
深入浅析python定时杀进程
Jun 06 Python
由浅入深讲解python中的yield与generator
Apr 05 Python
Python文件常见操作实例分析【读写、遍历】
Dec 10 Python
python启动应用程序和终止应用程序的方法
Jun 28 Python
pygame实现俄罗斯方块游戏(基础篇3)
Oct 29 Python
python实发邮件实例详解
Nov 11 Python
pytorch点乘与叉乘示例讲解
Dec 27 Python
详解Python实现进度条的4种方式
Jan 15 Python
Python基础教程之输入输出和运算符
Jul 26 Python
Python发送邮件实现基础解析
Aug 14 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使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
php+ajax实现无刷新的新闻留言系统
2020/12/21 PHP
详解CSS样式中的 !important * _ 符号
2021/03/09 HTML / CSS
flash javascript之间的通讯方法小结
2008/12/20 Javascript
javascript 写类方式之八
2009/07/05 Javascript
Mootools 1.2教程 输入过滤第一部分(数字)
2009/09/15 Javascript
点击文章内容处弹出页面代码
2009/10/01 Javascript
Jquery自定义button按钮的几种方法
2014/06/11 Javascript
Javascript字符串拼接小技巧(推荐)
2016/06/02 Javascript
详解Weex基于Vue2.0开发模板搭建
2017/03/20 Javascript
nodejs中sleep功能实现暂停几秒的方法
2017/07/12 NodeJs
Vue+Element实现动态生成新表单并添加验证功能
2019/05/23 Javascript
js属性对象的hasOwnProperty方法的使用
2021/02/05 Javascript
[05:09]DOTA2-DPC中国联赛2月22日Recap集锦
2021/03/11 DOTA
python爬虫获取淘宝天猫商品详细参数
2020/06/23 Python
对python中的iter()函数与next()函数详解
2018/10/18 Python
浅谈Python爬虫基本套路
2019/03/25 Python
PyQt5固定窗口大小的方法
2019/06/18 Python
python适合人工智能的理由和优势
2019/06/28 Python
python将字符串list写入excel和txt的实例
2019/07/20 Python
Python基于BeautifulSoup和requests实现的爬虫功能示例
2019/08/02 Python
解决Tensorflow 使用时cpu编译不支持警告的问题
2020/02/03 Python
python修改微信和支付宝步数的示例代码
2020/10/12 Python
实列教程 一款基于jquery和css3的响应式二级导航菜单
2014/11/13 HTML / CSS
Tory Burch德国官网:美国时尚生活品牌
2018/01/03 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
英国领先的男装设计师服装独立零售商:Repertoire Fashion
2020/10/19 全球购物
2014全国两会学习心得体会1000字
2014/03/10 职场文书
关于随地扔垃圾的检讨书
2014/09/30 职场文书
2015年班干部工作总结
2015/04/29 职场文书
小学班主任研修日志
2015/11/13 职场文书
五年级数学教学反思
2016/02/16 职场文书
《天净沙·秋思》教学反思三篇
2019/11/02 职场文书
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
在SQL Server中使用 Try Catch 处理异常的示例详解
2022/07/15 SQL Server
使用JS前端技术实现静态图片局部流动效果
2022/08/05 Javascript