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找出list中最常出现元素的方法
Jun 14 Python
Python爬虫实例_利用百度地图API批量获取城市所有的POI点
Jan 10 Python
Python KMeans聚类问题分析
Feb 23 Python
对Python获取屏幕截图的4种方法详解
Aug 27 Python
python将print输出的信息保留到日志文件中
Sep 27 Python
Python多继承以及MRO顺序的使用
Nov 11 Python
如何基于Python实现电子邮件的发送
Dec 16 Python
Django分组聚合查询实例分享
Apr 29 Python
Django视图、传参和forms验证操作
Jul 15 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
基于Python爬取51cto博客页面信息过程解析
Aug 25 Python
Python OpenCV实现图形检测示例详解
Apr 08 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程序员常见的40个陋习,你中了几个?
2014/11/20 PHP
示例详解Laravel重置密码代码重构
2016/08/10 PHP
Laravel基础-关于引入公共文件的两种方式
2019/10/18 PHP
prototype 的说明 js类
2006/09/07 Javascript
javascript innerHTML使用分析
2010/12/03 Javascript
Jquery:ajax实现翻页无刷新功能代码
2013/08/05 Javascript
javascript将相对路径转绝对路径示例
2014/03/14 Javascript
浅析四种常见的Javascript声明循环变量的书写方式
2015/10/14 Javascript
js实现延时加载Flash的方法
2015/11/26 Javascript
js实现字符串和数组之间相互转换操作
2016/01/12 Javascript
JavaScript记录光标在编辑器中位置的实现方法
2016/04/22 Javascript
select隐藏选中值对应的id,显示其它id的简单实现方法
2016/08/25 Javascript
修改Jquery Dialog 位置的实现方法
2016/08/26 Javascript
JavaScript正则表达式和级联效果
2017/09/14 Javascript
JavaScript for循环 if判断语句(学习笔记)
2017/10/11 Javascript
element-ui 表格实现单元格可编辑的示例
2018/02/26 Javascript
实例详解Vue项目使用eslint + prettier规范代码风格
2018/08/20 Javascript
一次Webpack配置文件的分离实战记录
2018/11/30 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
layer弹出框确定前验证:弹出消息框的方法(弹出两个layer)
2019/09/21 Javascript
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
vue 使用class创建和清除水印的示例代码
2020/12/25 Vue.js
Python基于twisted实现简单的web服务器
2014/09/29 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
Python序列操作之进阶篇
2016/12/08 Python
python用requests实现http请求代码实例
2019/10/31 Python
浅谈django 重载str 方法
2020/05/19 Python
Python request中文乱码问题解决方案
2020/09/17 Python
CSS3 创建网页动画实现弹跳球动效果
2018/10/30 HTML / CSS
心理学专业毕业生推荐信范文
2013/11/21 职场文书
运动会闭幕式解说词
2014/02/21 职场文书
电子商务专业求职信
2014/07/10 职场文书
婚礼父母答谢词
2015/01/04 职场文书
2015年爱牙日活动总结
2015/03/23 职场文书
《浅水洼里的小鱼》教学反思
2016/02/16 职场文书
教你利用Nginx 服务搭建子域环境提升二维地图加载性能的步骤
2021/09/25 Servers