Python实现的数据结构与算法之链表详解


Posted in Python onApril 22, 2015

本文实例讲述了Python实现的数据结构与算法之链表。分享给大家供大家参考。具体分析如下:

一、概述

链表(linked list)是一组数据项的集合,其中每个数据项都是一个节点的一部分,每个节点还包含指向下一个节点的链接。
根据结构的不同,链表可以分为单向链表、单向循环链表、双向链表、双向循环链表等。其中,单向链表和单向循环链表的结构如下图所示:

Python实现的数据结构与算法之链表详解

二、ADT

这里只考虑单向循环链表ADT,其他类型的链表ADT大同小异。单向循环链表ADT(抽象数据类型)一般提供以下接口:

① SinCycLinkedlist() 创建单向循环链表
② add(item) 向链表中插入数据项
③ remove(item) 删除链表中的数据项
④ search(item) 在链表中查找数据项是否存在
⑤ empty() 判断链表是否为空
⑥ size() 返回链表中数据项的个数

单向循环链表操作的示意图如下:

Python实现的数据结构与算法之链表详解

三、Python实现

Python的内建类型list底层是由C数组实现的,list在功能上更接近C++的vector(因为可以动态调整数组大小)。我们都知道,数组是连续列表,链表是链接列表,二者在概念和结构上完全不同,因此list不能用于实现链表。
在C/C++中,通常采用“指针+结构体”来实现链表;而在Python中,则可以采用“引用+类”来实现链表。在下面的代码中,SinCycLinkedlist类代表单向循环链表,Node类代表链表中的一个节点:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
class Node:
  def __init__(self, initdata):
    self.__data = initdata
    self.__next = None
  def getData(self):
    return self.__data
  def getNext(self):
    return self.__next
  def setData(self, newdata):
    self.__data = newdata
  def setNext(self, newnext):
    self.__next = newnext
class SinCycLinkedlist:
  def __init__(self):
    self.head = Node(None)
    self.head.setNext(self.head)
  def add(self, item):
    temp = Node(item)
    temp.setNext(self.head.getNext())
    self.head.setNext(temp)
  def remove(self, item):
    prev = self.head
    while prev.getNext() != self.head:
      cur = prev.getNext()
      if cur.getData() == item:
        prev.setNext(cur.getNext())
      prev = prev.getNext()
  def search(self, item):
    cur = self.head.getNext()
    while cur != self.head:
      if cur.getData() == item:
        return True
      cur = cur.getNext()
    return False
  def empty(self):
    return self.head.getNext() == self.head
  def size(self):
    count = 0
    cur = self.head.getNext()
    while cur != self.head:
      count += 1
      cur = cur.getNext()
    return count
if __name__ == '__main__':
  s = SinCycLinkedlist()
  print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))
  s.add(19)
  s.add(86)
  print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))
  print('86 is%s in s' % ('' if s.search(86) else ' not',))
  print('4 is%s in s' % ('' if s.search(4) else ' not',))
  print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))
  s.remove(19)
  print('s.empty() == %s, s.size() == %s' % (s.empty(), s.size()))

运行结果:

$ python sincyclinkedlist.py
s.empty() == True, s.size() == 0
s.empty() == False, s.size() == 2
86 is in s
4 is not in s
s.empty() == False, s.size() == 2
s.empty() == False, s.size() == 1

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
简单介绍Python中的floor()方法
May 15 Python
Python3中的2to3转换工具使用示例
Jun 12 Python
详解在Python的Django框架中创建模板库的方法
Jul 20 Python
Mac中升级Python2.7到Python3.5步骤详解
Apr 27 Python
django 发送手机验证码的示例代码
Apr 25 Python
Python爬虫之UserAgent的使用实例
Feb 21 Python
Python使用MyQR制作专属动态彩色二维码功能
Jun 04 Python
python写程序统计词频的方法
Jul 29 Python
Python3 JSON编码解码方法详解
Sep 06 Python
python实现简单颜色识别程序
Feb 19 Python
使用 django orm 写 exists 条件过滤实例
May 20 Python
Python datetime模块的使用示例
Feb 02 Python
Python实现的数据结构与算法之双端队列详解
Apr 22 #Python
Python实现的数据结构与算法之队列详解
Apr 22 #Python
详尽讲述用Python的Django框架测试驱动开发的教程
Apr 22 #Python
Hadoop中的Python框架的使用指南
Apr 22 #Python
Python实现提取文章摘要的方法
Apr 21 #Python
python中map、any、all函数用法分析
Apr 21 #Python
用于统计项目中代码总行数的Python脚本分享
Apr 21 #Python
You might like
PHP与MySQL开发的8个技巧小结
2010/12/17 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
PHP中Http协议post请求参数
2015/11/02 PHP
优化WordPress的Google字体以加速国内服务器上的运行
2015/11/24 PHP
Zend Framework教程之Resource Autoloading用法实例
2016/03/08 PHP
PHP排序二叉树基本功能实现方法示例
2018/05/26 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
通过JAVASCRIPT读取ASP设定的COOKIE
2006/11/24 Javascript
用js实现键盘方向键翻页功能的代码
2007/06/03 Javascript
jQuery 操作下拉列表框实现代码
2010/02/22 Javascript
javascript XMLHttpRequest对象全面剖析
2010/04/24 Javascript
Javascript 自适应高度的Tab选项卡
2011/04/05 Javascript
js,jQuery 排序的实现代码,网页标签排序的实现,标签排序
2011/04/27 Javascript
JavaScript原型继承之基础机制分析
2011/08/26 Javascript
js substr、substring和slice使用说明小记
2011/09/15 Javascript
深入理解JavaScript系列(13) This? Yes,this!
2012/01/18 Javascript
jquery图片延迟加载 前端开发技能必备系列
2012/06/18 Javascript
Bootstrap每天必学之下拉菜单
2015/11/25 Javascript
微信小程序手势操作之单触摸点与多触摸点
2017/03/10 Javascript
详解vue2.0的Element UI的表格table列时间戳格式化
2017/06/13 Javascript
纯js代码生成可搜索选择下拉列表的实例
2018/01/11 Javascript
详解Vue实战指南之依赖注入(provide/inject)
2018/11/13 Javascript
微信小程序和百度的语音识别接口详解
2019/05/06 Javascript
Vue程序化的事件监听器(实例方案详解)
2020/01/07 Javascript
vue 路由守卫(导航守卫)及其具体使用
2020/02/25 Javascript
python中abs&map&reduce简介
2018/02/20 Python
浅谈Python中的zip()与*zip()函数详解
2018/02/24 Python
python查看模块安装位置的方法
2018/10/16 Python
Python数据报表之Excel操作模块用法分析
2019/03/11 Python
canvas基础之图形验证码的示例
2018/01/02 HTML / CSS
html5清空画布方法(三种)
2017/10/16 HTML / CSS
remote接口和home接口主要作用
2013/05/15 面试题
《他得的红圈圈最多》教学反思
2014/04/24 职场文书
教师见习报告范文
2014/11/03 职场文书
python实现会员信息管理系统(List)
2022/03/18 Python
Python实现双向链表基本操作
2022/05/25 Python