python实现双向链表原理

 更新时间:2022年05月25日 13:26:13   作者:lislislislislis  
这篇文章主要为大家详细介绍了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

指定位置插入节点

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

删除元素

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()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Python中JsonPath提取器和正则提取器

    Python中JsonPath提取器和正则提取器

    本文主要介绍了Python中JsonPath提取器和正则提取器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • Python框架Flask的基本数据库操作方法分析

    Python框架Flask的基本数据库操作方法分析

    这篇文章主要介绍了Python框架Flask的基本数据库操作方法,结合实例形式分析了Flask框架数据库操作常用函数功能、用法及相关注意事项,需要的朋友可以参考下
    2018-07-07
  • Python中消息订阅应用开发的最优5个方案及代码实现

    Python中消息订阅应用开发的最优5个方案及代码实现

    消息订阅是现代分布式系统中实现异步通信和解耦的核心技术之一,本文将为大家详细介绍一下5种最优的消息订阅方案,感兴趣的小伙伴可以了解下
    2025-03-03
  • 从0编写区块链之用python解释区块链最基本原理

    从0编写区块链之用python解释区块链最基本原理

    人工智能和区块链诞生至今已经有了十几年,当这些技术出现时,人们都说他们会改变世界,但至今为止,这两项技术对现实的影响依然有限,接下来通过本文介绍下从0编写区块链之用python解释区块链最基本原理,需要的朋友可以参考下
    2022-02-02
  • python实现水印生成器

    python实现水印生成器

    这篇文章主要为大家详细介绍了python实现水印生成器,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • python 文本单词提取和词频统计的实例

    python 文本单词提取和词频统计的实例

    今天小编就为大家分享一篇python 文本单词提取和词频统计的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • Python enumerate()计数器简化循环

    Python enumerate()计数器简化循环

    这篇文章主要介绍了Python enumerate()计数器简化循环,enumerate()最大的优点就是它返回一个带有计数器和值的元组,因此我们不必自己增加计数器,下面就来看看文章具体对它的详细介绍吧,需要的朋友可以参考一下
    2021-12-12
  • python线程池的实现实例

    python线程池的实现实例

    这篇文章主要介绍了python线程池的实现方法,代码简单实用,供大家参考使用
    2013-11-11
  • python可视化分析的实现(matplotlib、seaborn、ggplot2)

    python可视化分析的实现(matplotlib、seaborn、ggplot2)

    这篇文章主要介绍了python可视化分析的实现(matplotlib、seaborn、ggplot2),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 解决numpy数组互换两行及赋值的问题

    解决numpy数组互换两行及赋值的问题

    这篇文章主要介绍了解决numpy数组互换两行及赋值的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-04-04

最新评论