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实现同时兼容老版和新版Socket协议的一个简单WebSocket服务器
Jun 04 Python
使用Python生成url短链接的方法
May 04 Python
python冒泡排序简单实现方法
Jul 09 Python
Python爬虫之模拟知乎登录的方法教程
May 25 Python
python 全局变量的import机制介绍
Sep 07 Python
python和shell监控linux服务器的详细代码
Jun 22 Python
Python3自动签到 定时任务 判断节假日的实例
Nov 13 Python
在PyCharm下打包*.py程序成.exe的方法
Nov 29 Python
基于Python实现大文件分割和命名脚本过程解析
Sep 29 Python
keras的siamese(孪生网络)实现案例
Jun 12 Python
pycharm 2020 1.1的安装流程
Sep 29 Python
python操作xlsx格式文件并读取
Jun 02 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设计模式之命令模式的应用详解
2013/05/21 PHP
PHP中对缓冲区的控制实现代码
2013/09/29 PHP
php实现文件下载(支持中文文名)
2013/12/04 PHP
PHP使用Face++接口开发微信公众平台人脸识别系统的方法
2015/04/17 PHP
ThinkPHP函数详解之M方法和R方法
2015/09/10 PHP
PHP 中TP5 Request 请求对象的实例详解
2017/07/31 PHP
微信公众号之主动给用户发送消息功能
2019/06/22 PHP
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
Javascript控制页面链接在新窗口打开具体方法
2013/08/16 Javascript
Jquery.Form 异步提交表单的简单实例
2014/03/03 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
使用nodejs、Python写的一个简易HTTP静态文件服务器
2014/07/18 NodeJs
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
学习JavaScript设计模式之单例模式
2016/01/19 Javascript
跨域资源共享 CORS 详解
2016/04/26 Javascript
基于JS实现回到页面顶部的五种写法(从实现到增强)
2016/09/03 Javascript
javascript实现鼠标点击页面 移动DIV
2016/12/02 Javascript
canvas绘制多边形
2017/02/24 Javascript
Js面试算法详解
2018/04/08 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
js new Date()实例测试
2019/10/31 Javascript
javascript实现异形滚动轮播
2019/11/28 Javascript
微信小程序关键字变色实现代码实例
2019/12/13 Javascript
[03:22]DSPL第一期精彩集锦:酷炫到底!
2014/11/07 DOTA
[01:25:33]完美世界DOTA2联赛PWL S3 INK ICE vs Magma 第二场 12.20
2020/12/23 DOTA
Python多进程并发(multiprocessing)用法实例详解
2015/06/02 Python
python3+PyQt5实现支持多线程的页面索引器应用程序
2018/04/20 Python
python Pillow图像处理方法汇总
2019/10/16 Python
简单的HTML5初步入门教程
2015/09/29 HTML / CSS
巴基斯坦购物网站:Goto
2019/03/11 全球购物
美国批发供应商:Kole Imports
2019/04/10 全球购物
安全生产责任书
2014/03/12 职场文书
对教师的评语
2014/04/28 职场文书
浅谈如何提高PHP代码质量之端到端集成测试
2021/05/28 PHP
斗罗大陆八大特殊魂兽,龙族始祖排榜首,第五最残忍(翠魔鸟)
2022/03/18 国漫
剑指Offer之Java算法习题精讲二叉树专项训练
2022/03/21 Java/Android