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实现简单的计时器功能函数
Mar 14 Python
Python中用sleep()方法操作时间的教程
May 22 Python
Python自动化开发学习之三级菜单制作
Jul 14 Python
Python 绘制酷炫的三维图步骤详解
Jul 12 Python
Python+Selenium使用Page Object实现页面自动化测试
Jul 14 Python
Django后端发送小程序微信模板消息示例(服务通知)
Dec 17 Python
python deque模块简单使用代码实例
Mar 12 Python
快速解决jupyter notebook启动需要密码的问题
Apr 21 Python
深入了解NumPy 高级索引
Jul 24 Python
如何利用python发送邮件
Sep 26 Python
python 实现mysql自动增删分区的方法
Apr 01 Python
Python源码解析之List
May 21 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
Base64在线编码解码实现代码 演示与下载
2011/01/08 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
PHP使用第三方即时获取物流动态实例详解
2017/04/27 PHP
详解PHP中的外观模式facade pattern
2018/02/05 PHP
微信公众号开发之获取位置信息php代码
2018/06/13 PHP
jquery 必填项判断表单是否为空的方法
2008/09/14 Javascript
使表格的标题列可左右拉伸jquery插件封装
2014/11/24 Javascript
Vue.js 中的 $watch使用方法
2017/05/25 Javascript
原生JS实现 MUI导航栏透明渐变效果
2017/11/07 Javascript
vue拖拽组件 vuedraggable API options实现盒子之间相互拖拽排序
2019/07/08 Javascript
JavaScript实现原型封装轮播图
2020/12/27 Javascript
在Python中操作字典之update()方法的使用
2015/05/22 Python
python 二分查找和快速排序实例详解
2017/10/13 Python
浅析Python3爬虫登录模拟
2018/02/07 Python
Python统计纯文本文件中英文单词出现个数的方法总结【测试可用】
2018/07/25 Python
对python中数据集划分函数StratifiedShuffleSplit的使用详解
2018/12/11 Python
基于Django OneToOneField和ForeignKey的区别详解
2020/03/30 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
CSS3条纹背景制作的实战攻略
2016/05/31 HTML / CSS
俄罗斯优惠券网站:BIGLION
2017/05/21 全球购物
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
函数指针的定义是什么
2016/08/14 面试题
查询优化的一般准则有哪些
2015/03/08 面试题
当x.equals(y)等于true时,x.hashCode()与y.hashCode()可以不相等,这句话对不对
2015/05/02 面试题
高中生学习的自我评价
2013/12/14 职场文书
电台实习生求职信
2014/02/25 职场文书
技校毕业生自荐书
2014/05/23 职场文书
校园环保标语
2014/06/13 职场文书
交通志愿者活动总结
2014/06/27 职场文书
党员干部三严三实心得体会
2014/10/13 职场文书
2015年毕业生自荐信范文
2015/03/24 职场文书
酒店总经理岗位职责
2015/04/01 职场文书
2015年领导干部廉洁自律工作总结
2015/05/26 职场文书
初一军训感言
2015/08/01 职场文书
2015年国庆放假通知范文
2015/08/18 职场文书
mysql 索引的数据结构为什么要采用B+树
2022/04/26 MySQL