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 相关文章推荐
wxpython 最小化到托盘与欢迎图片的实现方法
Jun 09 Python
python在非root权限下的安装方法
Jan 23 Python
python  创建一个保留重复值的列表的补码
Oct 15 Python
Python数据类型之Number数字操作实例详解
May 08 Python
python生成requirements.txt的两种方法
Sep 18 Python
Python实现图片裁剪的两种方式(Pillow和OpenCV)
Oct 30 Python
dpn网络的pytorch实现方式
Jan 14 Python
tensorflow中tf.slice和tf.gather切片函数的使用
Jan 19 Python
用Python在Excel里画出蒙娜丽莎的方法示例
Apr 28 Python
基于selenium及python实现下拉选项定位select
Jul 22 Python
Anaconda的安装与虚拟环境建立
Nov 18 Python
分位数回归模型quantile regeression应用详解及示例教程
Nov 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
怎样辨别一杯好咖啡
2021/03/03 新手入门
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
详解PHP+AJAX无刷新分页实现方法
2015/11/03 PHP
WordPress中访客登陆实现邮件提醒的PHP脚本实例分享
2015/12/14 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
thinkphp3.x中display方法及show方法的用法实例
2016/05/19 PHP
PHP上传图片到数据库并显示的实例代码
2019/12/20 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
Mootools 1.2教程(21)——类(二)
2009/09/15 Javascript
JS批量修改PS中图层名称的方法
2014/01/26 Javascript
Jquery获取元素的父容器对象示例代码
2014/02/10 Javascript
jquery利用命名空间移除绑定事件的方法
2015/03/11 Javascript
利用jQuery及AJAX技术定时更新GridView的某一列数据
2015/12/04 Javascript
jquery.validate 自定义验证方法及validate相关参数
2016/01/18 Javascript
Javascript实现鼠标框选操作  不是点击选取
2016/04/14 Javascript
简单理解vue中track-by属性
2016/10/26 Javascript
js的三种继承方式详解
2017/01/21 Javascript
JS常用倒计时代码实例总结
2017/02/07 Javascript
vue2.0 keep-alive最佳实践
2017/07/06 Javascript
详解react-router 4.0 下服务器如何配合BrowserRouter
2017/12/29 Javascript
Vue.js点击切换按钮改变内容的实例讲解
2018/08/22 Javascript
微信小程序实现商品属性联动选择
2019/02/15 Javascript
vue2之简易的pc端短信验证码的问题及处理方法
2019/06/03 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
Python随机生成一个6位的验证码代码分享
2015/03/24 Python
python sys.argv[]用法实例详解
2018/05/25 Python
Python生成短uuid的方法实例详解
2018/05/29 Python
浅谈Python 多进程默认不能共享全局变量的问题
2019/01/11 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
2019/07/15 Python
Python实现语音识别和语音合成功能
2019/09/20 Python
新手入门学习python Numpy基础操作
2020/03/02 Python
Python中remove漏删和索引越界问题的解决
2020/03/18 Python
使用Keras预训练好的模型进行目标类别预测详解
2020/06/27 Python
css3 2D图片转动样式可以扩充到Js当中
2014/04/29 HTML / CSS
请介绍一下Ant
2016/07/22 面试题
Nginx设置HTTPS的方法步骤 443证书配置方法
2022/03/21 Servers