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中用于检查英文字母大写的isupper()方法
May 19 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
Feb 18 Python
python opencv之SIFT算法示例
Feb 24 Python
numpy中实现二维数组按照某列、某行排序的方法
Apr 04 Python
PyQt5 pyqt多线程操作入门
May 05 Python
matplotlib实现热成像图colorbar和极坐标图的方法
Dec 13 Python
对python:循环定义多个变量的实例详解
Jan 20 Python
flask框架路由常用定义方式总结
Jul 23 Python
Python 取numpy数组的某几行某几列方法
Oct 24 Python
python 使用while循环输出*组成的菱形实例
Apr 12 Python
使用Python三角函数公式计算三角形的夹角案例
Apr 15 Python
Python实现Appium端口检测与释放的实现
Dec 31 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
Amazon Prime Video平台《无限住人 -IMMORTAL-》2020年开始TV放送!
2020/03/06 日漫
php json与xml序列化/反序列化
2013/10/28 PHP
PHP的自定义模板引擎
2017/03/24 PHP
PHP获取文件扩展名的常用方法小结【五种方式】
2018/04/27 PHP
php输出文字乱码的解决方法
2019/10/04 PHP
JavaScript 权威指南(第四版) 读书笔记
2009/08/11 Javascript
GRID拖拽行的实例代码
2013/07/18 Javascript
JQuery自动触发事件的方法
2015/06/13 Javascript
基于JavaScript实现焦点图轮播效果
2017/03/27 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
vue中使用ueditor富文本编辑器
2018/02/08 Javascript
如何让微信小程序页面之间的通信不再变困难
2019/06/03 Javascript
基于vue手写tree插件的那点事儿
2019/08/20 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
vue中的v-model原理,与组件自定义v-model详解
2020/08/04 Javascript
Vue中用JSON实现刷新界面不影响倒计时
2020/10/26 Javascript
夯基础之手撕javascript继承详解
2020/11/09 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
Vue 集成 PDF.js 实现 PDF 预览和添加水印的步骤
2021/01/22 Vue.js
[58:18]2018DOTA2亚洲邀请赛3月29日 小组赛B组 iG VS Mineski
2018/03/30 DOTA
python中列表和元组的区别
2017/12/18 Python
python itchat实现调用微信接口的第三方模块方法
2019/06/11 Python
详解python中__name__的意义以及作用
2019/08/07 Python
python 经典数字滤波实例
2019/12/16 Python
Python实现投影法分割图像示例(一)
2020/01/17 Python
PySide2出现“ImportError: DLL load failed: 找不到指定的模块”的问题及解决方法
2020/06/10 Python
Python txt文件常用读写操作代码实例
2020/08/03 Python
python使用隐式循环快速求和的实现示例
2020/09/11 Python
H5 canvas实现贪吃蛇小游戏
2017/07/28 HTML / CSS
韩国现代百货官网:Hmall
2018/03/21 全球购物
婚前协议书怎么写
2014/04/15 职场文书
市场营销战略计划书
2014/05/06 职场文书
软弱涣散基层党组织整改方案
2014/10/25 职场文书
大学校园餐饮创业计划书
2019/08/07 职场文书
Python虚拟环境virtualenv是如何使用的
2021/06/20 Python
java基础——多线程
2021/07/03 Java/Android