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中处理XML的教程
Apr 29 Python
python条件变量之生产者与消费者操作实例分析
Mar 22 Python
如何安装多版本python python2和python3共存以及pip共存
Sep 18 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
Python如何实现动态数组
Nov 02 Python
Win系统PyQt5安装和使用教程
Dec 25 Python
python字典setdefault方法和get方法使用实例
Dec 25 Python
在pytorch中实现只让指定变量向后传播梯度
Feb 29 Python
jupyter notebook 恢复误删单元格或者历史代码的实现
Apr 17 Python
python时间序列数据转为timestamp格式的方法
Aug 03 Python
基于Python实现下载网易音乐代码实例
Aug 10 Python
Python3中最常用的5种线程锁实例总结
Jul 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 从数据库提取二进制图片的处理代码
2009/09/09 PHP
php文章内容分页并生成相应的htm静态页面代码
2010/06/07 PHP
PHP中用正则表达式清除字符串的空白
2011/01/17 PHP
php 的加密函数 md5,crypt,base64_encode 等使用介绍
2012/04/09 PHP
PHP入门经历和学习过程分享
2014/04/11 PHP
php5.3以后的版本连接sqlserver2000的方法
2014/07/28 PHP
如何解决PHP无法实现多线程的问题
2015/09/25 PHP
redis+php实现微博(一)注册与登录功能详解
2019/09/23 PHP
PHP pthreads v3下的Volatile简介与使用方法示例
2020/02/21 PHP
TNC vs RR BO3 第一场 2.14
2021/03/10 DOTA
jquery 面包屑导航 具体实现
2013/06/05 Javascript
调用DOM对象的focus使文本框获得焦点
2014/02/19 Javascript
js/jquery获取文本框输入焦点的方法
2014/03/04 Javascript
PHP使用方法重载实现动态创建属性的get和set方法
2014/11/17 Javascript
js实现同一页面多个不同运动效果的方法
2015/04/10 Javascript
JavaScript事件 "事件对象"的注意要点
2016/01/14 Javascript
基于jquery实现动态竖向柱状条特效
2016/02/12 Javascript
解决JS组件bootstrap table分页实现过程中遇到的问题
2016/04/21 Javascript
Bootstrap 折叠(Collapse)插件用法实例详解
2016/06/01 Javascript
ionic 上拉菜单(ActionSheet)实例代码
2016/06/06 Javascript
详解angular2如何手动点击特定元素上的点击事件
2018/10/16 Javascript
个人小程序接入支付解决方案
2019/05/23 Javascript
Vue组件跨层级获取组件操作
2020/07/27 Javascript
[46:14]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第一场 12.11
2020/12/16 DOTA
对Python中内置异常层次结构详解
2018/10/18 Python
Python用5行代码写一个自定义简单二维码
2018/10/21 Python
HTML5 canvas实现雪花飘落特效
2016/03/08 HTML / CSS
全球摩托车装备领导者:RevZilla
2017/09/04 全球购物
如何手工释放资源
2013/12/15 面试题
出国导师推荐信
2014/01/16 职场文书
总经理秘书岗位职责
2014/03/17 职场文书
党员承诺践诺书
2014/05/20 职场文书
年度评优评先方案
2014/06/03 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
大学生安全责任书
2014/07/25 职场文书
ktv好的活动方案
2014/08/15 职场文书