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 正则式使用心得
May 07 Python
Python基本数据类型详细介绍
Mar 11 Python
Django实现图片文字同时提交的方法
May 26 Python
Python实现信用卡系统(支持购物、转账、存取钱)
Jun 24 Python
Python实现的寻找前5个默尼森数算法示例
Mar 25 Python
利用Python读取txt文档的方法讲解
Jun 23 Python
一文带你了解Python中的字符串是什么
Nov 20 Python
python实现烟花小程序
Jan 30 Python
python3获取url文件大小示例代码
Sep 18 Python
python输出数组中指定元素的所有索引示例
Dec 06 Python
python PIL/cv2/base64相互转换实例
Jan 09 Python
python前后端自定义分页器
Apr 13 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静态新闻列表自动生成代码
2007/06/14 PHP
优化PHP程序的方法小结
2012/02/23 PHP
thinkPHP5.0框架安装教程
2017/03/25 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
javascript+xml技术实现分页浏览
2008/07/27 Javascript
FireFox与IE 下js兼容触发click事件的代码
2008/11/20 Javascript
jquery attr方法获取input的checked属性问题
2014/05/26 Javascript
js实现滚动条滚动到页面底部继续加载
2015/12/19 Javascript
使用jQuery的load方法设计动态加载及解决被加载页面js失效问题
2017/03/01 Javascript
浅谈原生JS实现jQuery的animate()动画示例
2017/03/08 Javascript
使用vue构建一个上传图片表单
2017/07/04 Javascript
ES6中数组array新增方法实例总结
2017/11/07 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
2018/09/26 Javascript
nodejs异步编程基础之回调函数用法分析
2018/12/26 NodeJs
详解如何更好的使用module vuex
2019/03/27 Javascript
JavaScript 实现下雪特效的示例代码
2020/09/09 Javascript
简单文件操作python 修改文件指定行的方法
2013/05/15 Python
Python队列的定义与使用方法示例
2017/06/24 Python
为什么选择python编程语言入门黑客攻防 给你几个理由!
2018/02/02 Python
python处理DICOM并计算三维模型体积
2019/02/26 Python
Python3搭建http服务器的实现代码
2020/02/11 Python
关于Kotlin中SAM转换的那些事
2020/09/15 Python
python+openCV对视频进行截取的实现
2020/11/27 Python
python利用文件时间批量重命名照片和视频
2021/02/09 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
HTML5 在canvas中绘制文本附效果图
2014/06/23 HTML / CSS
详解移动端html5页面长按实现高亮全选文本内容的兼容解决方案
2016/12/03 HTML / CSS
美国知名的摄影器材销售网站:Adorama
2017/02/01 全球购物
俄罗斯卫浴采暖及维修用品超级市场:Dkrussia
2020/05/12 全球购物
JSF面试题:Jsf中导航的标签是什么
2013/04/20 面试题
公关关系专员的自我评价分享
2013/11/20 职场文书
小学雷锋月活动总结
2014/07/03 职场文书
干部职工纪律作风整改措施思想汇报
2014/10/11 职场文书
出生公证书
2015/01/23 职场文书
生产现场禁烟通知
2015/04/23 职场文书
详解python字符串驻留技术
2021/05/21 Python