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 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
从Python的源码来解析Python下的freeblock
May 11 Python
简要讲解Python编程中线程的创建与锁的使用
Feb 28 Python
Python标准库shutil用法实例详解
Aug 13 Python
python梯度下降法的简单示例
Aug 31 Python
python读取和保存图片5种方法对比
Sep 12 Python
Python最小二乘法矩阵
Jan 02 Python
Python2比较当前图片跟图库哪个图片相似的方法示例
Sep 28 Python
Pandas-Cookbook 时间戳处理方式
Dec 07 Python
python ImageDraw类实现几何图形的绘制与文字的绘制
Feb 26 Python
python实现在内存中读写str和二进制数据代码
Apr 24 Python
python的reverse函数翻转结果为None的问题
May 11 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
一个目录遍历函数
2006/10/09 PHP
typecho插件编写教程(六):调用接口
2015/05/28 PHP
分享3个php获取日历的函数
2015/09/25 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
php下的原生ajax请求用法实例分析
2020/02/28 PHP
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
基于JQuery实现图片上传预览与删除操作
2016/05/24 Javascript
Vue.js 2.0中select级联下拉框实例
2017/03/06 Javascript
Angular 作用域scope的具体使用
2017/12/11 Javascript
vue实现城市列表选择功能
2018/07/16 Javascript
axios简单实现小程序延时loading指示
2018/07/30 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
解决layui的table插件无法多层级获取json数据的问题
2019/09/19 Javascript
基于Nuxt.js项目的服务端性能优化与错误检测(容错处理)
2019/10/23 Javascript
基于Element封装一个表格组件tableList的使用方法
2020/06/29 Javascript
uniapp电商小程序实现订单30分钟倒计时
2020/11/01 Javascript
利用 JavaScript 实现并发控制的示例代码
2020/12/31 Javascript
JS addEventListener()和attachEvent()方法实现注册事件
2021/01/11 Javascript
使用Python的urllib和urllib2模块制作爬虫的实例教程
2016/01/20 Python
Python利用Nagios增加微信报警通知的功能
2016/02/18 Python
Python中遇到的小问题及解决方法汇总
2017/01/11 Python
解决python使用open打开文件中文乱码的问题
2017/12/29 Python
基于Python开发chrome插件的方法分析
2018/07/07 Python
Python 中导入csv数据的三种方法
2018/11/01 Python
使用python动态生成波形曲线的实现
2019/12/04 Python
施华洛世奇波兰官网:SWAROVSKI波兰
2019/06/18 全球购物
新大陆软件面试题
2016/11/24 面试题
暑期实践思想汇报
2014/01/06 职场文书
黄河象教学反思
2014/02/10 职场文书
村居抓节水倡议书
2014/05/19 职场文书
世界读书日的活动方案
2014/08/20 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
会计稽核岗位职责
2015/04/13 职场文书
职业生涯规划书之大学四年
2019/08/07 职场文书
详解Apache SkyWalking 告警配置指南
2021/04/22 Servers
Python循环之while无限迭代
2022/04/30 Python