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中操作日期和时间之gmtime()方法的使用
May 22 Python
Python中pygame安装方法图文详解
Nov 11 Python
python调用fortran模块
Apr 08 Python
解决python3捕获cx_oracle抛出的异常错误问题
Oct 18 Python
python ipset管理 增删白名单的方法
Jan 14 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
Python实战购物车项目的实现参考
Feb 20 Python
python pandas模块基础学习详解
Jul 03 Python
python版百度语音识别功能
Jul 09 Python
python GUI库图形界面开发之PyQt5时间控件QTimer详细使用方法与实例
Feb 26 Python
Django静态文件加载失败解决方案
Aug 26 Python
python 8种必备的gui库
Aug 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
php中计算未知长度的字符串哪个字符出现的次数最多的代码
2012/08/14 PHP
基于PHP创建Cookie数组的详解
2013/07/03 PHP
php中自定义函数dump查看数组信息类似var_dump
2014/01/27 PHP
PHP pear安装配置教程
2016/05/14 PHP
Laravel 登录后清空COOKIE的操作方法
2019/10/14 PHP
jquery validation插件表单验证的一个例子
2010/03/03 Javascript
查找Oracle高消耗语句的方法
2014/03/22 Javascript
JavaScript将数字转换成大写中文的方法
2015/03/23 Javascript
jquery实现选中单选按钮下拉伸缩效果
2015/08/06 Javascript
javascript Promise简单学习使用方法小结
2016/05/17 Javascript
基于jQuery实现表格的查看修改删除
2016/08/01 Javascript
基于JavaScript实现在新的tab页打开url
2016/08/04 Javascript
NodeJS实现客户端js加密
2017/01/09 NodeJs
node.js基于fs模块对系统文件及目录进行读写操作的方法详解
2017/11/10 Javascript
脚手架vue-cli工程webpack的基本用法详解
2018/09/29 Javascript
webpack开发环境和生产环境的深入理解
2018/11/08 Javascript
js里面的变量范围分享
2020/07/18 Javascript
在antd Form表单中select设置初始值操作
2020/11/02 Javascript
[01:01:31]2018DOTA2亚洲邀请赛3月29日小组赛B组 Mineski VS paiN
2018/03/30 DOTA
多个应用共存的Django配置方法
2018/05/30 Python
Python3 pywin32模块安装的详细步骤
2020/05/26 Python
python 操作excel表格的方法
2020/12/05 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
德国高性价比网上药店:medpex
2017/07/09 全球购物
英国最大的笔记本电脑直销专家:Laptops Direct
2019/07/20 全球购物
美国体育用品商店:Academy Sports + Outdoors
2020/01/04 全球购物
上课迟到检讨书100字
2014/01/11 职场文书
仓库组长岗位职责
2014/01/29 职场文书
实习协议书范本
2014/04/22 职场文书
工地质量标语
2014/06/12 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
情感电台广播稿
2015/08/18 职场文书
安全学习心得体会范文
2016/01/18 职场文书
工程移交协议书
2016/03/24 职场文书
2019年入党思想汇报
2019/03/25 职场文书
Win10系统搭建ftp文件服务器详细教程
2022/08/05 Servers