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测试驱动开发实例
Oct 08 Python
Python中优化NumPy包使用性能的教程
Apr 23 Python
python求解水仙花数的方法
May 11 Python
python生成随机密码或随机字符串的方法
Jul 03 Python
Python后台管理员管理前台会员信息的讲解
Jan 28 Python
Python理解递归的方法总结
Jan 28 Python
VSCode Python开发环境配置的详细步骤
Feb 22 Python
Python线程指南分享
Nov 19 Python
Python实现图像去噪方式(中值去噪和均值去噪)
Dec 18 Python
如何将tensorflow训练好的模型移植到Android (MNIST手写数字识别)
Apr 22 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
Jan 08 Python
python中24小时制转换为12小时制的方法
Jun 18 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/04 无线电
Optimizer与Debugger兼容性问题的解决方法
2008/12/01 PHP
判断Keep-Alive模式的HTTP请求的结束的实现代码
2011/08/06 PHP
初识PHP中的Swoole
2016/04/05 PHP
PHP读MYSQL中文乱码的快速解决方法
2016/10/01 PHP
PHP获取本周所有日期或者最近七天所有日期的方法
2018/06/20 PHP
javascript中递归函数用法注意点
2015/07/30 Javascript
JS提示:Uncaught SyntaxError: Unexpected token ILLEGAL错误的解决方法
2016/08/19 Javascript
jquery延迟对象解析
2016/10/26 Javascript
jQuery实现简单的抽奖游戏
2017/05/05 jQuery
基于vue中解决v-for使用报红并出现警告的问题
2018/03/03 Javascript
微信小程序实现分享到朋友圈功能
2018/07/19 Javascript
vue生命周期和react生命周期对比【推荐】
2018/09/19 Javascript
vue 指令和过滤器的基本使用(品牌管理案例)
2019/11/04 Javascript
Vue 解决多级动态面包屑导航的问题
2019/11/04 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
有趣的JavaScript隐式类型转换操作实例分析
2020/05/02 Javascript
nodejs使用Sequelize框架操作数据库的实现
2020/10/21 NodeJs
vue element实现表格合并行数据
2020/11/30 Vue.js
一个基于flask的web应用诞生 组织结构调整(7)
2017/04/11 Python
python中通过预先编译正则表达式提高效率
2017/09/25 Python
Python3多线程爬虫实例讲解代码
2018/01/05 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
python 字符串和整数的转换方法
2018/06/25 Python
python中map的基本用法示例
2018/09/10 Python
浅析Python 实现一个自动化翻译和替换的工具
2019/04/14 Python
Selenium基于PIL实现拼接滚动截图
2020/04/10 Python
Python列表如何更新值
2020/05/27 Python
python爬虫多次请求超时的几种重试方法(6种)
2020/12/01 Python
用HTML5.0制作网页的教程
2010/05/30 HTML / CSS
Noon埃及:埃及在线购物
2019/11/26 全球购物
金融专业大学生职业生涯规划范文
2014/01/16 职场文书
人事代理委托书
2014/09/27 职场文书
幼儿园学前班幼儿评语
2014/12/29 职场文书
2015年纪委工作总结
2015/05/13 职场文书
Fluentd搭建日志收集服务
2022/09/23 Servers