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 相关文章推荐
精确查找PHP WEBSHELL木马的方法(1)
Apr 12 Python
跨平台python异步回调机制实现和使用方法
Nov 26 Python
python发送邮件示例(支持中文邮件标题)
Feb 16 Python
在Python中处理日期和时间的基本知识点整理汇总
May 22 Python
Python函数定义及传参方式详解(4种)
Mar 18 Python
使用 Python 玩转 GitHub 的贡献板(推荐)
Apr 04 Python
Django使用unittest模块进行单元测试过程解析
Aug 02 Python
Python如何脚本过滤文件中的注释
May 27 Python
使用Python通过oBIX协议访问Niagara数据的示例
Dec 04 Python
OpenCV-Python实现轮廓的特征值
Jun 09 Python
使用pipenv管理python虚拟环境的全过程
Sep 25 Python
Python中的嵌套循环详情
Mar 23 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
DC《小丑》11项提名领跑奥斯卡 Netflix成第92届奥斯卡提名最大赢家
2020/04/09 欧美动漫
常用的php ADODB使用方法集锦
2008/03/25 PHP
Symfony核心类概述
2016/03/17 PHP
PHP 返回13位时间戳的实现代码
2016/05/13 PHP
PHP二进制与字符串之间的相互转换教程
2016/10/14 PHP
PHP crc32()函数讲解
2019/02/14 PHP
js和jquery批量绑定事件传参数一(新猪猪原创)
2010/06/23 Javascript
js仿3366小游戏选字游戏
2016/04/14 Javascript
对象转换为原始值的实现方法
2016/06/06 Javascript
Vue.js结合bootstrap实现分页控件
2017/03/10 Javascript
JS文件中加载jquery.js的实例代码
2018/05/05 jQuery
vue-cli整合vuex的时候,修改actions和mutations,实现热部署的方法
2018/09/19 Javascript
Node.js net模块功能及事件监听用法分析
2019/01/05 Javascript
[38:21]2014 DOTA2国际邀请赛中国区预选赛5.21 TongFu VS LGD-CDEC
2014/05/22 DOTA
python用字典统计单词或汉字词个数示例
2014/04/22 Python
python中list常用操作实例详解
2015/06/03 Python
Python根据区号生成手机号码的方法
2015/07/08 Python
python3中zip()函数使用详解
2018/06/29 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
python 寻找离散序列极值点的方法
2019/07/10 Python
Django 权限认证(根据不同的用户,设置不同的显示和访问权限)
2019/07/24 Python
python处理写入数据代码讲解
2020/10/22 Python
加拿大花店:1800Flowers.ca
2016/11/16 全球购物
西班牙鞋子和箱包在线销售网站:zapatos.es
2020/02/17 全球购物
洗煤厂厂长岗位职责
2014/01/03 职场文书
怀念母亲教学反思
2014/04/28 职场文书
诚信考试标语
2014/06/24 职场文书
应届生面试求职信
2014/07/02 职场文书
企业安全生产目标责任书
2014/07/23 职场文书
个人借款协议书范本
2014/11/17 职场文书
合作意向协议书
2015/01/29 职场文书
2015年环保局工作总结
2015/05/22 职场文书
国庆节新闻稿
2015/07/17 职场文书
干部考核工作总结2015
2015/07/24 职场文书
HTML速写之Emmet语法规则的实现
2021/04/07 HTML / CSS
CSS实现隐藏搜索框功能(动画正反向序列)
2021/07/21 HTML / CSS