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中的is和id用法分析
Jan 26 Python
python字符串过滤性能比较5种方法
Jun 22 Python
快速了解Python开发中的cookie及简单代码示例
Jan 17 Python
Python使用matplotlib和pandas实现的画图操作【经典示例】
Jun 13 Python
Python查找第n个子串的技巧分享
Jun 27 Python
Python爬虫抓取技术的一些经验
Jul 12 Python
python使用celery实现异步任务执行的例子
Aug 28 Python
Tensorflow实现部分参数梯度更新操作
Jan 23 Python
解决tensorboard多个events文件显示紊乱的问题
Feb 15 Python
Python解释器及PyCharm工具安装过程
Feb 26 Python
python实现文字版扫雷
Apr 24 Python
Python Tricks 使用 pywinrm 远程控制 Windows 主机的方法
Jul 21 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
显示程序执行时间php函数代码
2013/08/29 PHP
PHP中替换键名的简易方法示例详解
2014/01/07 PHP
php利用imagemagick实现复古老照片效果实例
2017/02/16 PHP
ThinkPHP5 验证器的具体使用
2018/05/31 PHP
jQuery学习笔记之jQuery的事件
2010/12/22 Javascript
javascript判断机器是否联网的2种方法
2013/08/09 Javascript
解析img图片没找到onerror事件 Stack overflow at line: 0
2013/12/23 Javascript
JS实现往下不断流动网页背景的方法
2015/02/27 Javascript
PHP+jQuery+Ajax实现多图片上传效果
2015/03/14 Javascript
微信小程序 wx:key详细介绍
2016/10/28 Javascript
JS实现的简单拖拽功能示例
2017/03/13 Javascript
Angular4实现图片上传预览路径不安全的问题解决
2017/12/25 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
在 Angular6 中使用 HTTP 请求服务端数据的步骤详解
2018/08/06 Javascript
webpack的CSS加载器的使用
2018/09/11 Javascript
Vue动画事件详解及过渡动画实例
2019/02/09 Javascript
浅谈JavaScript面向对象--继承
2019/03/20 Javascript
微信小程序实现发送模板消息功能示例【通过openid推送消息给用户】
2019/05/05 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
python中类的一些方法分析
2014/09/25 Python
python 反向输出字符串的方法
2018/07/16 Python
对Tensorflow中的变量初始化函数详解
2018/07/27 Python
python网络应用开发知识点浅析
2019/05/28 Python
解决python flask中config配置管理的问题
2019/07/26 Python
python创建n行m列数组示例
2019/12/02 Python
python烟花效果的代码实例
2020/02/25 Python
解决Pyinstaller打包软件失败的一个坑
2021/03/04 Python
师范生实习自我鉴定
2013/11/01 职场文书
网络维护中文求职信
2014/01/03 职场文书
公司活动邀请函
2014/01/24 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
学生逃课检讨书1000字
2014/10/20 职场文书
2015年学校减负工作总结
2015/05/19 职场文书
荒岛余生观后感
2015/06/09 职场文书
教导处教学工作总结
2015/08/12 职场文书