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中函数的多种格式和使用实例及小技巧
Apr 13 Python
Python操作MySQL数据库9个实用实例
Dec 11 Python
Python 含参构造函数实例详解
May 25 Python
使用PyCharm创建Django项目及基本配置详解
Oct 24 Python
Django web框架使用url path name详解
Apr 29 Python
Pytorch中的VGG实现修改最后一层FC
Jan 15 Python
python访问hdfs的操作
Jun 06 Python
python安装后的目录在哪里
Jun 21 Python
详解python中GPU版本的opencv常用方法介绍
Jul 24 Python
Python configparser模块应用过程解析
Aug 14 Python
python Selenium 库的使用技巧
Oct 16 Python
python 模拟登陆github的示例
Dec 04 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
DC游戏Steam周三特惠 《蝙蝠侠》阿卡姆系列平史低
2020/04/09 欧美动漫
PHP5 安装方法
2006/10/09 PHP
Smarty的配置与高级缓存技术分享
2012/06/05 PHP
php while循环得到循环次数
2013/10/26 PHP
php实现读取和写入tab分割的文件
2015/06/01 PHP
thinkPHP实现将excel导入到数据库中的方法
2016/04/22 PHP
javascript与asp.net(c#)互相调用方法
2009/12/13 Javascript
javascript 当前日期转化为中文的实现代码
2010/05/13 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
Extjs407 getValue()和getRawValue()区别介绍
2013/05/21 Javascript
js中switch case循环实例代码
2013/12/30 Javascript
jQuery实现折线图的方法
2015/02/28 Javascript
Jquery操作Ajax方法小结
2015/11/29 Javascript
nodejs个人博客开发第三步 载入页面
2017/04/12 NodeJs
微信小程序顶部可滚动导航效果
2017/10/31 Javascript
layui.js实现的表单验证功能示例
2017/11/15 Javascript
详解vue-cli脚手架build目录中的dev-server.js配置文件
2017/11/24 Javascript
jQuery+koa2实现简单的Ajax请求的示例
2018/03/06 jQuery
vue内置指令详解
2018/04/03 Javascript
mpvue全局引入sass文件的方法步骤
2019/03/06 Javascript
vue基础之模板和过滤器用法实例分析
2019/03/12 Javascript
vue-next/runtime-core 源码阅读指南详解
2019/10/25 Javascript
原生js实现密码强度验证功能
2020/03/18 Javascript
[04:04]DOTA2亚洲邀请赛比赛场馆&酒店全攻略
2017/03/23 DOTA
[49:27]2018DOTA2亚洲邀请赛 4.4 淘汰赛 TNC vs VG 第一场
2018/04/05 DOTA
Python找出最小的K个数实例代码
2018/01/04 Python
Django 浅谈根据配置生成SQL语句的问题
2018/05/29 Python
Python FTP文件定时自动下载实现过程解析
2019/11/12 Python
Bootstrap 学习分享
2012/11/12 HTML / CSS
工商管理系学生的自我评价分享
2013/11/29 职场文书
2015年春节标语口号
2014/12/09 职场文书
实习生辞职信范文
2015/03/02 职场文书
企业办公室主任岗位职责
2015/04/01 职场文书
观看《筑梦中国》纪录片心得体会
2016/01/18 职场文书
使用CSS设置滚动条样式
2022/01/18 HTML / CSS
Win11自动黑屏怎么办 Win11自动黑屏设置教程
2022/07/15 数码科技