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概率计算器实例分析
Mar 25 Python
python实现的简单FTP上传下载文件实例
Jun 30 Python
Windows中使用wxPython和py2exe开发Python的GUI程序的实例教程
Jul 11 Python
Python实现的读写json文件功能示例
Jun 05 Python
对python csv模块配置分隔符和引用符详解
Dec 12 Python
Python不同目录间进行模块调用的实现方法
Jan 29 Python
python实现抠图给证件照换背景源码
Aug 20 Python
Python collections模块使用方法详解
Aug 28 Python
pytorch AvgPool2d函数使用详解
Jan 03 Python
Python tkinter三种布局实例详解
Jan 06 Python
python实现人脸签到系统
Apr 13 Python
Pygame Draw绘图函数的具体使用
Nov 17 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
如何删除多级目录
2006/10/09 PHP
Window 7/XP 安装Apache 2.4与PHP 5.4 的过程详解
2013/06/02 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
基于ThinkPHP5.0实现图片上传插件
2017/09/25 PHP
thinkphp5修改view到根目录实例方法
2019/07/02 PHP
浅谈laravel orm 中的一对多关系 hasMany
2019/10/21 PHP
javascript淡入淡出效果的实现思路
2012/03/31 Javascript
有关于JS辅助函数inherit()的问题
2013/04/07 Javascript
JS常用表单验证方法总结
2014/05/22 Javascript
JavaScript统计网站访问次数的实现代码
2015/11/18 Javascript
JavaScript动态添加事件之事件委托
2016/07/12 Javascript
JS中用childNodes获取子元素换行会产生一个子元素
2016/12/08 Javascript
详解Angular的双向数据绑定(MV-VM)
2016/12/26 Javascript
js封装成插件的步骤方法
2017/09/11 Javascript
基于滚动条位置判断的简单实例
2017/12/14 Javascript
Vue官方推荐AJAX组件axios.js使用方法详解与API
2018/10/09 Javascript
layui清空,重置表单数据的实例
2019/09/12 Javascript
详解element-ui级联菜单(城市三级联动菜单)和回显问题
2019/10/02 Javascript
Python实现数据库编程方法详解
2015/06/09 Python
Python使用smtplib模块发送电子邮件的流程详解
2016/06/27 Python
使用Turtle画正螺旋线的方法
2017/09/22 Python
python+selenium实现163邮箱自动登陆的方法
2017/12/31 Python
Python使用Scrapy爬虫框架全站爬取图片并保存本地的实现代码
2018/03/04 Python
python3的print()函数的用法图文讲解
2019/07/16 Python
Python多进程编程multiprocessing代码实例
2020/03/12 Python
Python下载网易云歌单歌曲的示例代码
2020/08/12 Python
香港最新科技与优质家居产品购物网站:J SELECT
2018/08/21 全球购物
英国屋顶用品和材料超市:Roofing Supplies UK
2019/08/24 全球购物
英国设计师泳装、沙滩装和比基尼在线精品店:Beach Cafe
2019/08/28 全球购物
幼教毕业生自我鉴定
2014/01/12 职场文书
新娘父亲婚礼致辞
2014/01/16 职场文书
集体婚礼策划方案
2014/02/22 职场文书
运动会广播稿20字
2015/08/19 职场文书
IDEA 链接Mysql数据库并执行查询操作的完整代码
2021/05/20 MySQL
详解JavaScript中Arguments对象用途
2021/08/30 Javascript
详解PyTorch模型保存与加载
2022/04/28 Python