python实现双向链表原理


Posted in Python onMay 25, 2022

双向链表

一种更复杂的链表是“双向链表”或“双面链表”。每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。

python实现双向链表原理

操作

is_empty() 链表是否为空
length() 链表长度
travel() 遍历链表
add(item) 链表头部添加
append(item) 链表尾部添加
insert(pos, item) 指定位置添加
remove(item) 删除节点
search(item) 查找节点是否存在

实现

class Node(object):
    """双向链表节点"""
    def __init__(self, item):
        self.item = item
        self.next = None
        self.prev = None


class DLinkList(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指向node
            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():
            # 如果是空链表,将_head指向node
            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(item)
            cur = self.__head
            count = 0
            # 移动到指定位置的前一个位置
            while count < (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):
        """删除元素"""
        cur = self.__head
        while cur != None:
            # 找到了要删除的元素
            if cur.item == item:
                # 先判断此结点是否是头节点
                # 头节点
                if cur == self.__head:
                    self.__head = cur.next
                    # 如果存在下一个结点,则设置下一个结点
                    if cur.next:
                        # 判断链表是否只有一个结点
                        cur.next.prev = None
                else:
                    cur.prev.next = cur.next
                    # 如果存在下一个结点,则设置下一个结点
                    if cur.next:
                        cur.next.prev = cur.prev
                break
            else:
                cur = cur.next

测试

if __name__ == "__main__":
    ll = DLinkList()
    ll.add(1)
    ll.add(2)
    ll.append(3)
    ll.insert(2, 4)
    ll.insert(4, 5)
    ll.insert(0, 6)
    print "length:",ll.length()
    ll.travel()
    print ll.search(3)
    print ll.search(4)
    ll.remove(1)
    print "length:",ll.length()
    ll.travel()

以上就是本文的全部内容,希望对大家的学习有所帮助。


Tags in this post...

Python 相关文章推荐
使用python实现tcp自动重连
Jul 02 Python
浅谈Python实现Apriori算法介绍
Dec 20 Python
Python之pandas读写文件乱码的解决方法
Apr 20 Python
Linux下python3.7.0安装教程
Jul 30 Python
Linux下Pycharm、Anaconda环境配置及使用踩坑
Dec 19 Python
python 对字典按照value进行排序的方法
May 09 Python
python使用QQ邮箱实现自动发送邮件
Jun 22 Python
django ObjectDoesNotExist 和 DoesNotExist的用法
Jul 09 Python
python使用dlib进行人脸检测和关键点的示例
Dec 05 Python
Python3自带工具2to3.py 转换 Python2.x 代码到Python3的操作
Mar 03 Python
python opencv将多个图放在一个窗口的实例详解
Feb 28 Python
在python中读取和写入CSV文件详情
Jun 28 Python
Python代码实现双链表
详解NumPy中的线性关系与数据修剪压缩
python实现双链表
May 25 #Python
Python实现双向链表
May 25 #Python
python区块链持久化和命令行接口实现简版
May 25 #Python
python区块链实现简版工作量证明
May 25 #Python
pycharm无法安装cv2模块问题
May 20 #Python
You might like
跟我学Laravel之视图 &amp; Response
2014/10/15 PHP
php使用Session和文件统计在线人数
2015/07/04 PHP
PHP操作MySQL中BLOB字段的方法示例【存储文本与图片】
2017/09/15 PHP
php通过header发送自定义数据方法
2018/01/18 PHP
ThinkPHP5框架实现简单的批量查询功能示例
2018/06/07 PHP
javascript针对DOM的应用实例(一)
2012/04/15 Javascript
Easyui 之 Treegrid 笔记
2016/04/29 Javascript
javascript循环链表之约瑟夫环的实现方法
2017/01/16 Javascript
H5实现中奖记录逐行滚动切换效果
2017/03/13 Javascript
axios基本入门用法教程
2017/03/25 Javascript
vue学习笔记之v-if和v-show的区别
2017/09/20 Javascript
jquery实现企业定位式导航效果
2018/01/01 jQuery
JavaScript图片处理与合成总结
2018/03/04 Javascript
在NPM发布自己造的轮子的方法步骤
2019/03/09 Javascript
[23:18]Spirit vs Liquid Supermajor小组赛A组 BO3 第二场 6.2
2018/06/03 DOTA
Python实现的金山快盘的签到程序
2013/01/17 Python
python sys模块sys.path使用方法示例
2013/12/04 Python
python实现文件路径和url相互转换的方法
2015/07/06 Python
Python实现简单石头剪刀布游戏
2021/01/20 Python
python实现电子书翻页小程序
2019/07/23 Python
python开发实例之Python的Twisted框架中Deferred对象的详细用法与实例
2020/03/19 Python
selenium+python自动化78-autoit参数化与批量上传功能的实现
2021/03/04 Python
美国韩国化妆品和护肤品购物网站:Beautytap
2018/07/29 全球购物
国际贸易专业推荐信
2013/11/15 职场文书
体育教育个人自荐信范文
2013/12/01 职场文书
办公室人员先进事迹
2014/01/27 职场文书
教师学习培训邀请函
2014/02/04 职场文书
学习十八大坚定理想信念心得体会
2014/03/11 职场文书
教堂婚礼主持词
2014/03/14 职场文书
大型公益活动策划方案
2014/08/20 职场文书
撤诉申请怎么写
2015/05/19 职场文书
财务管理制度范本
2015/08/04 职场文书
2016感恩父亲节主题广播稿
2015/12/18 职场文书
2019送给家人们的中秋节祝福语
2019/08/15 职场文书
Mysql数据库按时间点恢复实战记录
2021/06/30 MySQL
动画「进击的巨人」第86话播出感谢绘公开
2022/03/21 日漫