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自动重试HTTP连接装饰器
Apr 28 Python
python查看模块,对象的函数方法
Oct 16 Python
Python中出现IndentationError:unindent does not match any outer indentation level错误的解决方法
Apr 18 Python
详解python之heapq模块及排序操作
Apr 04 Python
基于Python实现人脸自动戴口罩系统
Feb 06 Python
python 实现线程之间的通信示例
Feb 14 Python
python numpy矩阵信息说明,shape,size,dtype
May 22 Python
Python socket服务常用操作代码实例
Jun 22 Python
Python实现图片查找轮廓、多边形拟合、最小外接矩形代码
Jul 14 Python
浅析Python requests 模块
Oct 09 Python
详解Python3.8+PyQt5+pyqt5-tools+Pycharm配置详细教程
Nov 02 Python
python爬虫用request库处理cookie的实例讲解
Feb 20 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
《心理测量者3》剧场版动画预告
2020/03/02 日漫
php数组一对一替换实现代码
2012/08/31 PHP
php获取当月最后一天函数分享
2015/02/02 PHP
php HTML无刷新提交表单
2016/04/05 PHP
CI框架中数据库操作函数$this->db->where()相关用法总结
2016/05/17 PHP
Javascript Tab 导航插件 (23个)
2009/06/11 Javascript
Javascript的一种模块模式
2010/09/08 Javascript
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
JavaScript高级程序设计(第3版)学习笔记 概述
2012/10/11 Javascript
简单谈谈JavaScript的同步与异步
2015/12/31 Javascript
两种方法解决javascript url post 特殊字符转义 + & #
2016/04/13 Javascript
Node.js开发教程之基于OnceIO框架实现文件上传和验证功能
2016/11/30 Javascript
基于JavaScript实现瀑布流效果
2017/03/29 Javascript
图片加载完成再执行事件的实例
2017/11/16 Javascript
layer弹出的iframe层在执行完毕后关闭当前弹出层的方法
2018/08/17 Javascript
python中readline判断文件读取结束的方法
2014/11/08 Python
python实现自动重启本程序的方法
2015/07/09 Python
图文讲解选择排序算法的原理及在Python中的实现
2016/05/04 Python
Python栈算法的实现与简单应用示例
2017/11/01 Python
python matplotlib坐标轴设置的方法
2017/12/05 Python
Python正则表达式指南 推荐
2018/10/09 Python
Python 闭包,函数分隔作用域,nonlocal声明非局部变量操作示例
2019/10/14 Python
在Python中使用MongoEngine操作数据库教程实例
2019/12/03 Python
Pytorch数据拼接与拆分操作实现图解
2020/04/30 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
Python Switch Case三种实现方法代码实例
2020/06/18 Python
python中selenium库的基本使用详解
2020/07/31 Python
Alba Moda德国网上商店:意大利时尚女装销售
2016/11/14 全球购物
J.Crew官网:美国知名休闲服装品牌
2017/05/19 全球购物
芬兰灯具网上商店:Nettilamppu.fi
2018/06/30 全球购物
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
Linux不知道文件后缀名怎么判断文件类型
2014/08/21 面试题
校园学雷锋活动月总结
2014/03/09 职场文书
大学生旷课检讨书1000字
2015/02/19 职场文书
朋友聚会开场白
2015/06/01 职场文书
一次SQL查询优化原理分析(900W+数据从17s到300ms)
2022/06/10 SQL Server