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实现获取序列中最小的几个元素
Sep 25 Python
使用Pyrex来扩展和加速Python程序的教程
Apr 13 Python
python 根据pid杀死相应进程的方法
Jan 16 Python
基于python的字节编译详解
Sep 20 Python
python清除字符串中间空格的实例讲解
May 11 Python
Python计算一个给定时间点前一个月和后一个月第一天的方法
May 29 Python
Python自动发送邮件的方法实例总结
Dec 08 Python
如何更改 pandas dataframe 中两列的位置
Dec 27 Python
Python响应对象text属性乱码解决方案
Mar 31 Python
Python 使用双重循环打印图形菱形操作
Aug 09 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
Feb 05 Python
python FTP编程基础入门
Feb 27 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
如何使用脚本模仿登陆过程
2006/11/22 PHP
PHP 魔术函数使用说明
2010/05/14 PHP
深入解析fsockopen与pfsockopen的区别
2013/07/05 PHP
PHP连接SQLServer2005方法及代码
2013/12/26 PHP
php网页病毒清除类
2014/12/08 PHP
php中smarty区域循环的方法
2015/06/11 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
简单实用jquery版三级联动select示例
2013/07/04 Javascript
js中的时间转换—毫秒转换成日期时间的示例代码
2014/01/26 Javascript
javascript替换已有元素replaceChild()使用介绍
2014/04/03 Javascript
浅谈JavaScript Date日期和时间对象
2014/12/29 Javascript
jquery比较简洁的软键盘特效实现方法
2015/03/19 Javascript
jquery实现动态改变div宽度和高度
2015/05/08 Javascript
javascript 四十条常用技巧大全
2016/09/09 Javascript
Node.js 实现简单小说爬虫实例
2016/11/18 Javascript
jquery实现多次上传同一张图片
2017/01/09 Javascript
jQuery模拟窗口抖动效果
2017/03/15 Javascript
Vue.js中数据绑定的语法教程
2017/06/02 Javascript
利用pm2部署多个node.js项目的配置教程
2017/10/22 Javascript
红黑树的插入详解及Javascript实现方法示例
2018/03/26 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[00:58]2016年国际邀请赛勇士令状宣传片
2016/06/01 DOTA
Python装饰器知识点补充
2018/05/28 Python
python 读取文件并替换字段的实例
2018/07/12 Python
python 保存float类型的小数的位数方法
2018/10/17 Python
Python语言快速上手学习方法
2018/12/14 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
python mysql中in参数化说明
2020/06/05 Python
10款最佳Python开发工具推荐,每一款都是神器
2020/10/15 Python
CSS3 实现侧边栏展开收起动画
2014/12/22 HTML / CSS
关于canvas绘制模糊问题的解决方法
2019/09/24 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
初始化了一个没有run()方法的线程类,是否会出错?
2014/03/27 面试题
中医专业应届生求职信
2013/11/17 职场文书
入党积极分子批评与自我批评思想汇报
2014/09/14 职场文书
2019开业庆典剪彩仪式主持词!
2019/07/22 职场文书