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


Posted in Python onDecember 03, 2019

本文实例讲述了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算法学习之桶排序算法实例(分块排序)
Dec 18 Python
Python中的测试模块unittest和doctest的使用教程
Apr 14 Python
python批量添加zabbix Screens的两个脚本分享
Jan 16 Python
python的socket编程入门
Jan 29 Python
Python读写及备份oracle数据库操作示例
May 17 Python
python3 selenium 切换窗口的几种方法小结
May 21 Python
python画柱状图--不同颜色并显示数值的方法
Dec 13 Python
django foreignkey(外键)的实现
Jul 29 Python
pandas中DataFrame修改index、columns名的方法示例
Aug 02 Python
python模拟点击网页按钮实现方法
Feb 25 Python
python实现手势识别的示例(入门)
Apr 15 Python
python实现程序重启和系统重启方式
Apr 16 Python
Python读取实时数据流示例
Dec 02 #Python
简单了解python元组tuple相关原理
Dec 02 #Python
python实现智能语音天气预报
Dec 02 #Python
Python:二维列表下标互换方式(矩阵转置)
Dec 02 #Python
python 实现二维列表转置
Dec 02 #Python
python列表推导式入门学习解析
Dec 02 #Python
Python 矩阵转置的几种方法小结
Dec 02 #Python
You might like
如何跨站抓取别的站点的页面的补充
2006/10/09 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
详解PHP导入导出CSV文件
2014/11/03 PHP
PHP文件读取功能的应用实例
2015/05/08 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
PHP实现的日历功能示例
2018/09/01 PHP
js和as的稳定传值问题解决
2013/07/14 Javascript
jquery实现简单手风琴菜单效果实例
2015/06/13 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
JavaScript数据结构与算法之集合(Set)
2016/01/29 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
2016/06/17 Javascript
JavaScript 拖拽实例代码
2016/09/21 Javascript
前端实现文件的断点续传(前端文件提交+后端PHP文件接收)
2016/11/04 Javascript
浅谈vue中改elementUI默认样式引发的static与assets的区别
2018/02/03 Javascript
详解vue项目中如何引入全局sass/less变量、function、mixin
2018/06/02 Javascript
vue实现移动端悬浮窗效果
2018/12/01 Javascript
vue组件内部引入外部js文件的方法
2020/01/18 Javascript
[01:09:40]Newbee vs Pain 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
python进阶教程之循环对象
2014/08/30 Python
Python序列之list和tuple常用方法以及注意事项
2015/01/09 Python
Python对象转JSON字符串的方法
2016/04/27 Python
Python基础之getpass模块详细介绍
2017/08/10 Python
详解python实现线程安全的单例模式
2018/03/05 Python
Python3.4 splinter(模拟填写表单)使用方法
2018/10/13 Python
python 与服务器的共享文件夹交互方法
2018/12/27 Python
python 服务器运行代码报错ModuleNotFoundError的解决办法
2020/09/16 Python
CSS3 Media Queries详细介绍和使用实例
2014/05/08 HTML / CSS
英国川宁茶官方网站:Twinings茶
2019/05/21 全球购物
必须要使用游标的SQL语句有那些
2012/05/07 面试题
提高EJB性能都有哪些技巧
2012/03/25 面试题
专科应届生求职信
2013/11/24 职场文书
消防先进事迹材料
2014/02/10 职场文书
小学一年级数学教学反思
2016/02/16 职场文书
mysql数据库入门第一步之创建表
2021/05/14 MySQL
js实现模拟购物商城案例
2021/05/18 Javascript
JavaScript利用html5新方法操作元素类名详解
2021/11/27 Javascript