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 相关文章推荐
PHP魔术方法__ISSET、__UNSET使用实例
Nov 25 Python
在Python中用split()方法分割字符串的使用介绍
May 20 Python
Django中URL视图函数的一些高级概念介绍
Jul 20 Python
简单谈谈Python中的几种常见的数据类型
Feb 10 Python
简单学习Python多进程Multiprocessing
Aug 29 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python3+PyQt5重新实现QT事件处理程序
Apr 19 Python
Python中判断子串存在的性能比较及分析总结
Jun 23 Python
pytorch 使用加载训练好的模型做inference
Feb 20 Python
基于python实现获取网页图片过程解析
May 11 Python
Python爬虫之爬取二手房信息
Apr 27 Python
Python+OpenCV实现在图像上绘制矩形
Mar 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
高亮度显示php源代码
2006/10/09 PHP
PHP删除HTMl标签的实现代码
2013/06/30 PHP
ThinkPHP独立分组使用的注意事项
2014/11/25 PHP
PHP实现根据密码长度显示安全条
2017/07/04 PHP
在Laravel 中实现是否关注的示例
2019/10/22 PHP
如何用javascript去掉字符串里的所有空格
2007/02/08 Javascript
js获取元素相对窗口位置的实现代码
2014/09/28 Javascript
js实现class样式的修改、添加及删除的方法
2015/01/20 Javascript
jQuery入门之层次选择器实例简析
2015/12/11 Javascript
深入浅析JavaScript中的arguments对象(强力推荐)
2016/06/03 Javascript
Vue实现双向数据绑定
2017/05/03 Javascript
webpack构建react多页面应用详解
2017/09/15 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
jQuery实现的解析本地 XML 文档操作示例
2020/04/30 jQuery
详解Vue Cli浏览器兼容性实践
2020/06/08 Javascript
[02:28]PWL开团时刻DAY3——Ink Ice与DeMonsTer之间的勾心斗角
2020/11/03 DOTA
整理Python最基本的操作字典的方法
2015/04/24 Python
Python列表切片用法示例
2017/04/19 Python
windows下python安装paramiko模块和pycrypto模块(简单三步)
2017/07/06 Python
用python实现对比两张图片的不同
2018/02/05 Python
PyTorch 1.0 正式版已经发布了
2018/12/13 Python
Ubuntu下Python+Flask分分钟搭建自己的服务器教程
2019/11/19 Python
python 实现两个线程交替执行
2020/05/02 Python
Python‘==‘ 及 ‘is‘相关原理解析
2020/09/05 Python
python 进程池pool使用详解
2020/10/15 Python
Python爬取某平台短视频的方法
2021/02/08 Python
网购亚洲时装、美容产品和生活百货:YesStyle
2016/09/15 全球购物
会计学专业学生的求职信范文
2014/01/27 职场文书
服务理念口号
2014/06/11 职场文书
民政局副局长民主生活会个人对照检查材料
2014/09/19 职场文书
四风问题个人自查剖析材料思想汇报
2014/09/21 职场文书
公务员政审材料
2014/12/23 职场文书
《这片土地是神圣的》教学反思
2016/02/16 职场文书
创新创业项目计划书该怎样写?
2019/08/13 职场文书
MySQL高速缓存启动方法及参数详解(query_cache_size)
2021/07/01 MySQL
浅谈Redis跟MySQL的双写问题解决方案
2022/02/24 Redis