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实现的可以拷贝或剪切一个文件列表中的所有文件
Apr 30 Python
Python中dictionary items()系列函数的用法实例
Aug 21 Python
python3.5实现socket通讯示例(TCP)
Feb 07 Python
Python3实现将本地JSON大数据文件写入MySQL数据库的方法
Jun 13 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
在python中实现将一张图片剪切成四份的方法
Dec 05 Python
Python图像处理之直线和曲线的拟合与绘制【curve_fit()应用】
Dec 26 Python
python构建指数平滑预测模型示例
Nov 21 Python
Django-xadmin+rule对象级权限的实现方式
Mar 30 Python
Tensorflow--取tensorf指定列的操作方式
Jun 30 Python
python爬虫---requests库的用法详解
Sep 28 Python
Django实现随机图形验证码的示例
Oct 15 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设计模式  Command(命令模式)
2011/06/17 PHP
PHP curl 并发最佳实践代码分享
2012/09/05 PHP
将时间以距今多久的形式表示,PHP,js双版本
2012/09/25 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
PHP中返回引用类型的方法
2015/04/03 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
JavaScript高级程序设计(第3版)学习笔记4 js运算符和操作符
2012/10/11 Javascript
JavaScript中的this关键字使用方法总结
2015/03/13 Javascript
Jquery 1.9.1源码分析系列(十二)之筛选操作
2015/12/02 Javascript
js print打印网页指定区域内容的简单实例
2016/11/01 Javascript
jQuery简单获取DIV和A标签元素位置的方法
2017/02/07 Javascript
关于Promise 异步编程的实例讲解
2017/09/01 Javascript
Vue2.0基于vue-cli+webpack同级组件之间的通信教程(推荐)
2017/09/14 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
详解Vue中的scoped及穿透方法
2019/04/18 Javascript
JavaScript之scrollTop、scrollHeight、offsetTop、offsetHeight等属性学习笔记
2020/07/15 Javascript
react实现复选框全选和反选组件效果
2020/08/25 Javascript
[52:14]VG vs Serenity 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
[51:29]完美世界DOTA2联赛循环赛 Matador vs Forest BO2第一场 11.05
2020/11/05 DOTA
基于scrapy实现的简单蜘蛛采集程序
2015/04/17 Python
python实现中文转换url编码的方法
2016/06/14 Python
Python AES加密实例解析
2018/01/18 Python
5 分钟读懂Python 中的 Hook 钩子函数
2020/12/09 Python
HTML5高仿微信聊天、微信聊天表情|对话框|编辑器功能
2018/04/23 HTML / CSS
俄语地区最大的中国商品在线购物网站之一:Umka Mall
2019/11/03 全球购物
杭州-DOTNET笔试题集
2013/09/25 面试题
人大代表选举标语
2014/10/07 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
放弃继承权公证书
2015/01/23 职场文书
2015廉洁自律个人总结
2015/02/14 职场文书
新郎结婚保证书
2015/02/26 职场文书
通讯稿格式及范文
2015/07/22 职场文书
助学金申请书该怎么写?
2019/07/16 职场文书
Python作用域和名称空间的详细介绍
2022/04/13 Python
nginx搭建NFS网络文件系统
2022/04/14 Servers
Android开发 使用文件储存的方式保存QQ密码
2022/04/24 Java/Android