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模块之StringIO使用示例
Apr 08 Python
在Python中调用ggplot的三种方法
Apr 08 Python
Django的URLconf中使用缺省视图参数的方法
Jul 18 Python
Python+Wordpress制作小说站
Apr 14 Python
python学生信息管理系统
Mar 13 Python
python可视化text()函数使用详解
Feb 11 Python
利用python在excel中画图的实现方法
Mar 17 Python
Python轻量级web框架bottle使用方法解析
Jun 13 Python
python爬虫请求头设置代码
Jul 28 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
Oct 14 Python
Python 3.9的到来到底是意味着什么
Oct 14 Python
用Python实现定时备份Mongodb数据并上传到FTP服务器
Jan 27 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
Terran热键控制
2020/03/14 星际争霸
php不用内置函数对数组排序的两个算法代码
2010/02/08 PHP
PHP第一季视频教程(李炎恢+php100 不断更新)
2011/05/29 PHP
javascript操作cookie_获取与修改代码
2009/05/21 Javascript
js获取height和width的方法说明
2013/01/06 Javascript
javascript解决IE6下hover问题的方法
2015/07/28 Javascript
JS功能代码集锦
2016/05/04 Javascript
js数组的五种迭代方法及两种归并方法(推荐)
2016/06/14 Javascript
jquery easyui validatebox remote的使用详解
2016/11/09 Javascript
js实现城市级联菜单的2种方法
2017/06/23 Javascript
Vue项目使用CDN优化首屏加载问题
2018/04/01 Javascript
Vue 解决路由过渡动画抖动问题(实例详解)
2020/01/05 Javascript
vue实现tab栏点击高亮效果
2020/08/19 Javascript
[57:50]DOTA2上海特级锦标赛主赛事日 - 4 胜者组决赛Secret VS Liquid第二局
2016/03/05 DOTA
python魔法方法-自定义序列详解
2016/07/21 Python
python中import reload __import__的区别详解
2017/10/16 Python
详解python3中的真值测试
2018/08/13 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
Python 实现输入任意多个数,并计算其平均值的例子
2019/07/16 Python
python中调试或排错的五种方法示例
2019/09/12 Python
线程的基本概念、线程的基本状态以及状态之间的关系
2012/10/26 面试题
中药专业大学生医药工作求职信
2013/10/25 职场文书
毕业实习个人鉴定范文
2013/12/10 职场文书
工作表现自我评价
2014/02/08 职场文书
教师思想作风整顿个人剖析材料
2014/10/10 职场文书
学期个人自我总结
2015/02/13 职场文书
2015年暑期见闻
2015/07/14 职场文书
校园安全教育心得体会
2016/01/15 职场文书
小学2016年第十八届推普周活动总结
2016/04/05 职场文书
MySQL锁机制
2021/04/05 MySQL
看看如何用Python绘制小米新版天价logo
2021/04/20 Python
Python超简单容易上手的画图工具库推荐
2021/05/10 Python
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
关于CSS自定义属性与前端页面的主题切换问题
2022/03/21 HTML / CSS