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使用socket连接远程服务器的方法
Apr 29 Python
Python找出文件中使用率最高的汉字实例详解
Jun 03 Python
python rsa 加密解密
Mar 20 Python
Python调用系统底层API播放wav文件的方法
Aug 11 Python
详解python中的 is 操作符
Dec 26 Python
基于Python socket的端口扫描程序实例代码
Feb 09 Python
详解flask表单提交的两种方式
Jul 21 Python
python读取csv和txt数据转换成向量的实例
Feb 12 Python
Docker部署Python爬虫项目的方法步骤
Jan 19 Python
python支持多继承吗
Jun 19 Python
Python List remove()实例用法详解
Aug 02 Python
使用Python+OpenCV进行卡类型及16位卡号数字的OCR功能
Aug 30 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数据缓存技术
2007/02/14 PHP
邮箱正则表达式实现代码(针对php)
2013/06/21 PHP
php smarty truncate UTF8乱码问题解决办法
2014/06/13 PHP
ThinkPHP中session函数详解
2016/09/14 PHP
php 使用 __call实现重载功能示例
2019/11/18 PHP
jQuery ui 1.7更新小结
2009/08/15 Javascript
JQuery 弹出框定位实现方法
2010/12/02 Javascript
广泛收集的jQuery拖放插件集合
2012/04/09 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
JS仿iGoogle自定义首页模块拖拽特效的方法
2015/02/13 Javascript
javascript函数特点实例分析
2015/05/14 Javascript
JS中的eval 为什么加括号
2016/04/13 Javascript
JavaScript中style.left与offsetLeft的使用及区别详解
2016/06/08 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
如何获取TypeScript的声明文件.d.ts
2018/05/01 Javascript
vue+axios新手实践实现登陆的示例代码
2018/06/06 Javascript
深入浅析Vue全局组件与局部组件的区别
2018/06/15 Javascript
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
JS快速实现简单计算器
2020/04/08 Javascript
JavaScript实现简单的图片切换功能(实例代码)
2020/04/10 Javascript
[01:25]2015国际邀请赛最佳短片奖——斧王《拆塔英雄:天赋异禀》
2015/09/22 DOTA
Python中.join()和os.path.join()两个函数的用法详解
2018/06/11 Python
Python生成一个迭代器的实操方法
2019/06/18 Python
如何写python的配置文件
2020/06/07 Python
pycharm 实现调试窗口恢复
2021/02/05 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
DBA的职责都有哪些
2012/05/16 面试题
职业生涯规划书基本格式
2014/01/06 职场文书
机械电子工程专业自荐书
2014/06/10 职场文书
我的中国梦演讲稿初中篇
2014/08/19 职场文书
年度考核个人总结
2015/03/06 职场文书
家庭聚会祝酒词
2015/08/11 职场文书
Python 数据可视化神器Pyecharts绘制图像练习
2022/02/28 Python
virtualenv隔离Python环境的问题解析
2022/06/21 Python