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判断windows隐藏文件的方法
Mar 21 Python
Python3基础之基本数据类型概述
Aug 13 Python
python如何使用unittest测试接口
Apr 04 Python
PyQt5每天必学之带有标签的复选框
Apr 19 Python
Python实现EXCEL表格的排序功能示例
Jun 25 Python
python django 原生sql 获取数据的例子
Aug 14 Python
关于django 1.10 CSRF验证失败的解决方法
Aug 31 Python
python中open函数的基本用法示例
Sep 07 Python
python 并发下载器实现方法示例
Nov 22 Python
使用TFRecord存取多个数据案例
Feb 17 Python
Python实现栈的方法详解【基于数组和单链表两种方法】
Feb 22 Python
python gui开发——制作抖音无水印视频下载工具(附源码)
Feb 07 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中3种生成XML文件方法的速度效率比较
2012/10/06 PHP
thinkphp模板的包含与渲染实例分析
2014/11/26 PHP
php实现遍历文件夹的方法汇总
2017/03/02 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
2019/05/13 PHP
(JS实现)MapBar中坐标的加密和解密的脚本
2007/05/16 Javascript
在IE浏览器中resize事件执行多次的解决方法
2011/07/12 Javascript
jquery click([data],fn)使用方法实例介绍
2013/07/08 Javascript
js用拖动滑块来控制图片大小的方法
2015/02/27 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
jQuery简单自定义图片轮播插件及用法示例
2016/11/21 Javascript
JavaScript 用fetch 实现异步下载文件功能
2017/07/21 Javascript
浅谈webpack编译vue项目生成的代码探索
2017/12/11 Javascript
element-ui 限制日期选择的方法(datepicker)
2018/05/16 Javascript
vue实现数字动态翻牌的效果(开箱即用)
2019/12/08 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
微信小程序抽奖组件的使用步骤
2021/01/11 Javascript
python中argparse模块用法实例详解
2015/06/03 Python
编写自定义的Django模板加载器的简单示例
2015/07/21 Python
详解JavaScript编程中的window与window.screen对象
2015/10/26 Python
python脚本实现数据导出excel格式的简单方法(推荐)
2016/12/30 Python
浅谈python函数之作用域(python3.5)
2017/10/27 Python
python入门:这篇文章带你直接学会python
2018/09/14 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
pytorch 求网络模型参数实例
2019/12/30 Python
如何使用PyCharm将代码上传到GitHub上(图文详解)
2020/04/27 Python
Python实现JS解密并爬取某音漫客网站
2020/10/23 Python
Python制作简单的剪刀石头布游戏
2020/12/10 Python
html5与css3小应用
2013/04/03 HTML / CSS
出门问问全球官方商城:Tichome音箱和TicWatch智能手表
2017/12/02 全球购物
意大利体育用品和运动服网上商店:Maxi Sport
2019/09/14 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
文职个人求职信范文
2013/09/23 职场文书
党校学习自我鉴定
2014/02/24 职场文书
个人委托书
2014/07/31 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
MySQL的Query Cache图文详解
2021/07/01 MySQL