Python数据结构与算法之链表定义与用法实例详解【单链表、循环链表】


Posted in Python onSeptember 28, 2017

本文实例讲述了Python数据结构与算法之链表定义与用法。分享给大家供大家参考,具体如下:

本文将为大家讲解:

(1)从链表节点的定义开始,以类的方式,面向对象的思想进行链表的设计

(2)链表类插入和删除等成员函数实现时需要考虑的边界条件,
prepend(头部插入)、pop(头部删除)、append(尾部插入)、pop_last(尾部删除)

2.1 插入:

空链表
链表长度为1
插入到末尾

2.2 删除

空链表
链表长度为1
删除末尾元素

(3)从单链表到单链表的一众变体:

带尾节点的单链表
循环单链表
双链表

1. 链表节点的定义

class LNode:
 def __init__(self, elem, next_=None):
  self.elem = elem
  self.next = next_

2. 单链表的实现

重点理解插入、删除的实现及其需要考虑的边界条件:

class LinkedListUnderflow(ValueError):
 pass
class LList:
 def __init__(self):
  self._head = None
 def is_empty(self):
  return self._head is None
 def prepend(self, elem):
  self._head = LNode(elem, self._head)
 def pop(self):
  if self._head is None:
   raise LinkedListUnderflow('in pop')
  e = self._head.elem
  self._head = self._head.next
  return e
 def append(self, elem):
  if self._head is None:
   self._head = LNode(elem)
   return
  p = self._head
  while p.next is not None:
   p = p.next
  p.next = LNode(elem)
 def pop_last(self):
  if self._head is None:
   raise LinkedListUnderflow('in pop_last')
  p = self._head
  if p.next is None:
   e = p.elem
   self._head = None
   return e
  while p.next.next is not None:
   p = p.next
  e = p.next.elem
  p.next = None
  return e

简单总结:

(0)能够访问 p.next.next 的前提是 p.next 不为空;
(1)尾部插入,如果链表不为空,需且仅需改变的是尾部节点的指针;
(2)尾部删除,如果链表长度不为空,需且仅需改变的是倒数第二个节点的指针。

单链表的简单变形:具有尾部节点的单链表

class LList1(LList):
 def __init__(self):
  LList.__init__(self)
  self._rear = None
 ...

我们仅需重写的是:头部的插入、尾部的插入、尾部的删除

def prepend(self, elem):
 if self._head is None:
  self._head = LNode(elem)
  self._rear = self._head
 else:
  self._head = LNode(elem, self._head)
def append(self, elem):
 if self._head is None:
  self._head = LNode(elem)
  self._rear = self._head
 else:
  self._rear.next = LNode(elem)
  self._rear = self._rear.next
def pop_last(self):
 if self._head is None:
  raise LinkedListUnderflow('in pop_last')
 p = self._head
 if p.next is None:
  e = p.elem
  self._head = None
  return e
 while p.next.next is not None:
  p = p.next
 e = p.next.elem
 self._rear = p
 p.next = None
 return e

单链表的变体:循环单链表

class LCList:
 def __init__(self):
  self._rear = None
 def prepend(self, elem):
  if self._rear is None:
   self._rear = LNode(elem)
   self._rear.next = self._rear
  else:
   self._rear.next = LNode(elem, self._rear.next)
 def append(self, elem):
  self.prepend(elem)
  self_rear = self._rear.next
 def pop(self):
  if self._rear is None:
   raise LinkedListUnderflow('in pop')
  p = self._rear.next
  if p is None:
   self._rear = None
  else:
   self._rear.next = p.next
  return p.elem
 def printall(self):
  if self._rear is None:
   raise ...
  p = self._rear.next
  while True:
   print(p.elem)
   if p is self._rear:
    break
   p = p.next

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》及《Python文件与目录操作技巧汇总》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
Python中django学习心得
Dec 06 Python
windows下Virtualenvwrapper安装教程
Dec 13 Python
自定义django admin model表单提交的例子
Aug 23 Python
解决Django删除migrations文件夹中的文件后出现的异常问题
Aug 31 Python
Python3 sys.argv[ ]用法详解
Oct 24 Python
python基于celery实现异步任务周期任务定时任务
Dec 30 Python
Python获取、格式化当前时间日期的方法
Feb 10 Python
Django 5种类型Session使用方法解析
Apr 29 Python
Python实现封装打包自己写的代码,被python import
Jul 12 Python
python利用faker库批量生成测试数据
Oct 15 Python
python中用ctypes模拟点击的实例讲解
Nov 26 Python
Python实现压缩和解压缩ZIP文件的方法分析
Sep 28 #Python
Python有序字典简单实现方法示例
Sep 28 #Python
python操作MySQL 模拟简单银行转账操作
Sep 27 #Python
python利用urllib和urllib2访问http的GET/POST详解
Sep 27 #Python
python django使用haystack:全文检索的框架(实例讲解)
Sep 27 #Python
浅谈python和C语言混编的几种方式(推荐)
Sep 27 #Python
解决Python字典写入文件出行首行有空格的问题
Sep 27 #Python
You might like
社区(php&&mysql)五
2006/10/09 PHP
MySQL中create table语句的基本语法是
2007/01/15 PHP
也谈php网站在线人数统计
2008/04/09 PHP
phpmyadmin里面导入sql语句格式的大量数据的方法
2010/06/05 PHP
php中关于普通表单多文件上传的处理方法
2011/03/25 PHP
php中json_encode处理gbk与gb2312中文乱码问题的解决方法
2014/07/10 PHP
php递归创建目录的方法
2015/02/02 PHP
PHP微信网页授权的配置文件操作分析
2019/05/29 PHP
HTML IMG标签 onload 内存溢出导致浏览器CPU占用过高
2021/03/09 Javascript
javascript 浏览器判断 绑定事件 arguments 转换数组 数组遍历
2009/07/06 Javascript
js简单的表格添加行和删除行操作示例
2014/03/31 Javascript
JQuery插件ajaxfileupload.js异步上传文件实例
2015/05/19 Javascript
跟我学习javascript的函数调用和构造函数调用
2015/11/16 Javascript
Javascript农历与公历相互转换的简单实例
2016/10/09 Javascript
AngularJS监听ng-repeat渲染完成的两种方法
2018/01/16 Javascript
深入理解 Koa 框架中间件原理
2018/10/18 Javascript
你知道JavaScript Symbol类型怎么用吗
2020/01/08 Javascript
基于canvasJS在PHP中制作动态图表
2020/05/30 Javascript
JavaScript数组排序的六种常见算法总结
2020/08/18 Javascript
[56:46]2018DOTA2亚洲邀请赛 3.31 小组赛 B组 VP vs Effect
2018/04/01 DOTA
python实现发送邮件功能代码
2017/12/14 Python
Django + Uwsgi + Nginx 实现生产环境部署的方法
2018/06/20 Python
windows下cx_Freeze生成Python可执行程序的详细步骤
2018/10/09 Python
PyTorch中的padding(边缘填充)操作方式
2020/01/03 Python
使用wxpy实现自动发送微信消息功能
2020/02/28 Python
解析pip安装第三方库但PyCharm中却无法识别的问题及PyCharm安装第三方库的方法教程
2020/03/10 Python
Python如何实现线程间通信
2020/07/30 Python
加大码胸罩、内裤和服装:Just My Size
2019/03/21 全球购物
Stokke美国官方网店:高级儿童家具、推车、汽车座椅和配件
2020/06/06 全球购物
接口中的方法可以是abstract的吗
2015/07/23 面试题
幼儿园保育员辞职信
2014/01/12 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
户外宣传策划方案
2014/05/25 职场文书
爱心捐赠活动简讯
2015/07/20 职场文书
员工担保书范本
2015/09/22 职场文书
Pandas实现DataFrame的简单运算、统计与排序
2022/03/31 Python