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 相关文章推荐
在GitHub Pages上使用Pelican搭建博客的教程
Apr 25 Python
python数据结构之图深度优先和广度优先实例详解
Jul 08 Python
python3 pillow生成简单验证码图片的示例
Sep 19 Python
详解Tensorflow数据读取有三种方式(next_batch)
Feb 01 Python
快速解决PyCharm无法引用matplotlib的问题
May 24 Python
Numpy将二维数组添加到空数组的实现
Dec 05 Python
python_array[0][0]与array[0,0]的区别详解
Feb 18 Python
Python计算IV值的示例讲解
Feb 28 Python
详解用Python进行时间序列预测的7种方法
Mar 13 Python
记录模型训练时loss值的变化情况
Jun 16 Python
Python函数递归调用实现原理实例解析
Aug 11 Python
解决PyCharm无法使用lxml库的问题(图解)
Dec 22 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 定界符格式引起的错误
2011/05/24 PHP
深入Nginx + PHP 缓存详解
2013/07/11 PHP
php中simplexml_load_file函数用法实例
2014/11/12 PHP
学习thinkphp5.0验证类使用方法
2017/11/16 PHP
javascript 去字符串空格终极版(支持utf8)
2009/11/14 Javascript
javascript 子窗体父窗体相互传值方法
2010/05/31 Javascript
jquery下checked取值问题的解决方法
2012/08/09 Javascript
推荐17个优美新鲜的jQuery的工具提示插件
2012/09/14 Javascript
javascript实现json页面分页实例代码
2014/02/20 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
jQuery四种选择器使用及示例
2016/06/05 Javascript
DIV+CSS+jQ实现省市联动可扩展
2016/06/22 Javascript
用JS实现图片轮播效果代码(一)
2016/06/26 Javascript
require简单实现单页应用程序(SPA)
2016/07/12 Javascript
bootstrap实现每隔5秒自动轮播效果
2016/12/20 Javascript
javascript 秒表计时器实现代码
2017/03/09 Javascript
Ionic项目中Native Camera的使用方法
2017/06/07 Javascript
JS中offset和匀速动画详解
2018/02/06 Javascript
JavaScript实现捕获鼠标坐标
2020/04/12 Javascript
[57:55]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第二场 12.12
2020/12/16 DOTA
python操作redis的方法
2015/07/07 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
Python之list对应元素求和的方法
2018/06/28 Python
Python实现注册、登录小程序功能
2018/09/21 Python
详解Python3注释知识点
2019/02/19 Python
python字典与json转换的方法总结
2020/12/28 Python
CSS3中:nth-child和:nth-of-type的区别深入理解
2014/03/10 HTML / CSS
学年自我鉴定范文
2013/10/01 职场文书
草船借箭教学反思
2014/02/03 职场文书
出国留学单位推荐信
2015/03/26 职场文书
2015年乡镇纪检工作总结
2015/04/22 职场文书
追悼会答谢词范文
2015/09/29 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
智慧人生:永远不需要向任何人解释你自己
2019/08/20 职场文书
Nginx四层负载均衡的配置指南
2021/06/11 Servers
Java实现斗地主之洗牌发牌
2021/06/14 Java/Android