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 numpy 点数组去重的实例
Apr 18 Python
pyttsx3实现中文文字转语音的方法
Dec 24 Python
python如何解析配置文件并应用到项目中
Jun 27 Python
python3.7简单的爬虫实例详解
Jul 08 Python
解决Python3.8用pip安装turtle-0.0.2出现错误问题
Feb 11 Python
pytorch masked_fill报错的解决
Feb 18 Python
Python如何将字符串转换为日期
Jul 31 Python
用python爬虫批量下载pdf的实现
Dec 01 Python
全网最全python库selenium自动化使用详细教程
Jan 12 Python
在前女友婚礼上,用Python破解了现场的WIFI还把名称改成了
May 28 Python
Python pygame实现中国象棋单机版源码
Jun 20 Python
Python 使用 Frame tkraise() 方法在 Tkinter 应用程序中的Frame之间切换
Apr 24 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实现Mysql简易操作类
2015/10/11 PHP
PC端微信扫码支付成功之后自动跳转php版代码
2017/07/07 PHP
wordpress自定义标签云与随机获取标签的方法详解
2019/03/22 PHP
Javascript下IE与Firefox下的差异兼容写法总结
2010/06/18 Javascript
Easyui Treegrid改变默认图标的方法
2016/04/29 Javascript
JavaScript实现时间倒计时跳转(推荐)
2016/06/28 Javascript
BootStrapTable 单选及取值的实现方法
2017/01/10 Javascript
JS实现匀加速与匀减速运动的方法示例
2017/09/04 Javascript
VUE中的无限循环代码解析
2017/09/22 Javascript
详解jQuery获取特殊属性的值以及设置内容
2018/11/14 jQuery
layui 监听select选择 获取当前select的ID名称方法
2019/09/24 Javascript
JavaScript如何实现图片处理与合成
2020/05/29 Javascript
[03:09]2014DOTA2国际邀请赛 Mushi前队友送上祝福
2014/07/12 DOTA
python实现哈希表
2014/02/07 Python
python图像处理之反色实现方法
2015/05/30 Python
python 与GO中操作slice,list的方式实例代码
2017/03/20 Python
Python实现的各种常见分布算法示例
2018/12/13 Python
python脚本开机自启的实现方法
2019/06/28 Python
基于django传递数据到后端的例子
2019/08/16 Python
python3 写一个WAV音频文件播放器的代码
2019/09/27 Python
Django实现auth模块下的登录注册与注销功能
2019/10/10 Python
python字典和json.dumps()的遇到的坑分析
2020/03/11 Python
python pyqtgraph 保存图片到本地的实例
2020/03/14 Python
Python用SSH连接到网络设备
2021/02/18 Python
Deichmann英国:德国鞋类零售商
2021/01/30 全球购物
上课玩手机检讨书
2014/02/08 职场文书
座谈会主持词
2014/03/20 职场文书
节能标语大全
2014/06/21 职场文书
项目申报专员岗位职责
2014/07/09 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
2014银行授权委托书样本
2014/10/04 职场文书
病人家属写给医院的感谢信
2015/01/23 职场文书
地心历险记观后感
2015/06/15 职场文书
2015国庆节感想
2015/08/04 职场文书
基于python的matplotlib制作双Y轴图
2021/04/20 Python
CSS实现鼠标悬浮动画特效
2023/05/07 HTML / CSS