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  __getattr__与__setattr__使用方法
Sep 06 Python
Python yield 小结和实例
Apr 25 Python
Python可跨平台实现获取按键的方法
Mar 05 Python
举例讲解Python中is和id的用法
Apr 03 Python
在NumPy中创建空数组/矩阵的方法
Jun 15 Python
python实现简单flappy bird
Dec 24 Python
使用pyshp包进行shapefile文件修改的例子
Dec 06 Python
解决python运行启动报错问题
Jun 01 Python
Python设计密码强度校验程序
Jul 30 Python
Python操作dict时避免出现KeyError的几种解决方法
Sep 20 Python
python 生成正态分布数据,并绘图和解析
Dec 21 Python
如何在Python中创建二叉树
Mar 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引用返回与取消引用的详解
2013/06/08 PHP
两级联动select刷新后其值保持不变的实现方法
2014/01/27 PHP
php数组合并array_merge()函数使用注意事项
2014/06/19 PHP
PHP调试函数和日志记录函数分享
2015/01/31 PHP
PHP嵌套输出缓冲代码实例
2015/05/12 PHP
PHP的Socket通信之UDP通信实例
2015/07/02 PHP
深入理解PHP中mt_rand()随机数的安全
2017/10/12 PHP
CSS和JS标签style属性对照表(方便js开发的朋友)
2010/11/11 Javascript
面向对象Javascript核心支持代码分享
2012/05/23 Javascript
js 判断计算字符串长度/判断空的简单方法
2013/08/05 Javascript
两个select多选模式的选项相互移动(示例代码)
2014/01/11 Javascript
jQuery focus和blur事件的应用详解
2014/01/26 Javascript
jquery mobile的触控点击事件会多次触发问题的解决方法
2014/05/08 Javascript
解决JS无法调用Controller问题的方法
2015/12/31 Javascript
Ext JS框架中日期函数的用法及日期选择控件的实现
2016/05/21 Javascript
js传值后台中文出现乱码的解决方法
2016/06/30 Javascript
React组件生命周期详解
2017/07/03 Javascript
JScript实现地址选择功能
2017/08/15 Javascript
详解vue-cli中的ESlint配置文件eslintrc.js
2017/09/25 Javascript
PHP自动加载autoload和命名空间的应用小结
2017/12/01 Javascript
详解node.js的http模块实例演示
2018/07/12 Javascript
jQuery实现上下滚动公告栏详细代码
2018/11/21 jQuery
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
[02:07]2018DOTA2亚洲邀请赛主赛事第三日五佳镜头 fy极限反杀
2018/04/06 DOTA
python实现sublime3的less编译插件示例
2014/04/27 Python
Python深入学习之内存管理
2014/08/31 Python
Python for Informatics 第11章 正则表达式(一)
2016/04/21 Python
基于python实现百度翻译功能
2019/05/09 Python
python2 对excel表格操作完整示例
2020/02/23 Python
基于Python第三方插件实现西游记章节标注汉语拼音的方法
2020/05/22 Python
使用keras框架cnn+ctc_loss识别不定长字符图片操作
2020/06/29 Python
CSS3中Animation属性的使用详解
2015/08/06 HTML / CSS
2015年社区消防安全工作总结
2015/10/14 职场文书
教你用python实现一个无界面的小型图书管理系统
2021/05/21 Python
如何打开Win11系统注册表编辑器?Win11注册表编辑器打开修复方法
2022/04/05 数码科技
Mysql InnoDB 的内存逻辑架构
2022/05/06 MySQL