python双向链表原理与实现方法详解

 更新时间:2019年12月03日 08:38:40   作者:xlengji  
这篇文章主要介绍了python双向链表原理与实现方法,结合实例形式分析了Python双向链表的定义、以及节点的判断、遍历、添加、删除等相关操作技巧,需要的朋友可以参考下

本文实例讲述了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

更多关于Python相关内容感兴趣的读者可查看本站专题:《Python数据结构与算法教程》、《Python加密解密算法与技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

希望本文所述对大家Python程序设计有所帮助。

相关文章

  • 使用 Python 实现微信消息的一键已读的思路代码

    使用 Python 实现微信消息的一键已读的思路代码

    利用python可以实现微信消息的一键已读功能,怎么实现呢?你肯定会想着很复杂,但是python的好处就是很多人已经把接口打包做好了,只需要调用即可,今天通过本文给大家分享使用 Python 实现微信消息的一键已读的思路代码,一起看看吧
    2021-06-06
  • 用python实现弹球小游戏

    用python实现弹球小游戏

    大家好,本篇文章主要讲的是用python实现弹球小游戏,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • python实现在IDLE中输入多行的方法

    python实现在IDLE中输入多行的方法

    下面小编就为大家分享一篇python实现在IDLE中输入多行的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-04-04
  • 分享5个短小精悍的Python趣味脚本,适合小白上手!

    分享5个短小精悍的Python趣味脚本,适合小白上手!

    这篇文章主要给大家分享介绍了5个短小精悍的Python趣味脚本,非常适合小白上手,分别包含图片尺寸缩小、pdf转txt文档、猜数字游戏、电池电量告警以及图片添加水印等脚本,需要的朋友可以参考下
    2022-02-02
  • 如何利用饰器实现 Python 函数重载

    如何利用饰器实现 Python 函数重载

    这篇文章主要介绍了如何利用饰器实现 Python 函数重载,需要的朋友可以参考下面文章内容,希望能帮助到你
    2021-09-09
  • Python 列表list使用介绍

    Python 列表list使用介绍

    这篇文章主要介绍了Python 列表list使用介绍,需要的朋友可以参考下
    2014-11-11
  • Python爬虫入门案例之爬取二手房源数据

    Python爬虫入门案例之爬取二手房源数据

    读万卷书不如行万里路,学的扎不扎实要通过实战才能看出来,今天小编给大家带来一份python爬取二手房源信息的案例,可以用来直观的了解房价行情,大家可以在过程中查缺补漏,看看自己掌握程度怎么样
    2021-10-10
  • 让Python更加充分的使用Sqlite3

    让Python更加充分的使用Sqlite3

    这篇文章主要为大家详细介绍了Python更加充分的使用Sqlite3的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • Python标准库sched模块使用指南

    Python标准库sched模块使用指南

    这篇文章主要介绍了Python标准库sched模块使用的相关资料,需要的朋友可以参考下
    2017-07-07
  • python中常见错误及解决方法

    python中常见错误及解决方法

    在本篇内容里小编给大家分享的是一篇关于python中常见错误及解决方法的知识点内容,需要的朋友们参考下。
    2020-06-06

最新评论