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中的struct模块
Apr 28 Python
python中字符串类型json操作的注意事项
May 02 Python
对python中for、if、while的区别与比较方法
Jun 25 Python
Pycharm无法使用已经安装Selenium的解决方法
Oct 13 Python
python使用KNN算法识别手写数字
Apr 25 Python
Python3远程监控程序的实现方法
Jul 15 Python
pandas 中对特征进行硬编码和onehot编码的实现
Dec 20 Python
在Pytorch中计算自己模型的FLOPs方式
Dec 30 Python
pytorch自定义二值化网络层方式
Jan 07 Python
scrapy结合selenium解析动态页面的实现
Sep 28 Python
Python3.9.1中使用match方法详解
Feb 08 Python
Django一小时写出账号密码管理系统
Apr 29 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
PHP zlib扩展实现页面GZIP压缩输出
2010/06/17 PHP
PHP+MYSQL会员系统的登陆即权限判断实现代码
2011/09/23 PHP
FireFox浏览器使用Javascript上传大文件
2013/10/30 PHP
php调用C代码的实现方法
2014/03/11 PHP
20个2014年最优秀的PHP框架回顾
2014/10/22 PHP
Firefox window.close()的使用注意事项
2009/04/11 Javascript
JavaScript中通过闭包解决只能取得包含函数中任何变量最后一个值的问题
2010/08/12 Javascript
JS面向对象基础讲解(工厂模式、构造函数模式、原型模式、混合模式、动态原型模式)
2014/08/16 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
javascript关于运动的各种问题经典总结
2015/04/27 Javascript
详解JavaScript 中getElementsByName在IE中的注意事项
2017/02/21 Javascript
详解Angular结合zTree异步加载节点数据
2018/01/20 Javascript
Vue中使用vue-i18插件实现多语言切换功能
2018/04/25 Javascript
Vuex的初探与实战小结
2018/11/26 Javascript
js实现随机8位验证码
2020/07/24 Javascript
p5.js码绘“跳动的小正方形”的实现代码
2019/10/22 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
easyUI 实现的后台分页与前台显示功能示例
2020/06/01 Javascript
在python中的socket模块使用代理实例
2014/05/29 Python
python分析网页上所有超链接的方法
2015/05/08 Python
解析Python编程中的包结构
2015/10/25 Python
python操作列表的函数使用代码详解
2017/12/28 Python
python语言中with as的用法使用详解
2018/02/23 Python
python实现学生信息管理系统
2020/04/05 Python
flask中的wtforms使用方法
2018/07/21 Python
Pycharm之快速定位到某行快捷键的方法
2019/01/20 Python
HTML5 Canvas锯齿图代码实例
2014/04/10 HTML / CSS
ASOS亚洲:ASOS Asia
2018/03/04 全球购物
Java提供了哪些企业应用编程接口
2015/02/13 面试题
就业自荐信
2013/12/04 职场文书
工作失误检讨书范文大全
2014/01/13 职场文书
破坏寝室公物检讨书
2014/11/17 职场文书
圣诞晚会主持词开场白
2015/05/28 职场文书
音乐之声观后感
2015/06/04 职场文书
学习习近平主席讲话心得体会
2016/01/20 职场文书
html css3不拉伸图片显示效果
2021/06/07 HTML / CSS