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实现哈希表
Feb 07 Python
Python内存管理方式和垃圾回收算法解析
Nov 11 Python
python如何在循环引用中管理内存
Mar 20 Python
python实现维吉尼亚加密法
Mar 20 Python
python中while和for的区别总结
Jun 28 Python
python conda操作方法
Sep 11 Python
Python操作列表常用方法实例小结【创建、遍历、统计、切片等】
Oct 25 Python
通过实例简单了解Python中yield的作用
Dec 11 Python
pandas to_excel 添加颜色操作
Jul 14 Python
python 录制系统声音的示例
Dec 21 Python
Python实现给PDF添加水印的方法
Jan 25 Python
Python标准库pathlib操作目录和文件
Nov 20 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连接字符集的方法
2011/01/02 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php 修改上传文件大小限制实例详解
2016/10/23 PHP
PHP操作路由器实现方法示例
2019/04/27 PHP
Yii中特殊行为ActionFilter的使用方法示例
2020/10/18 PHP
Jquery实战_读书笔记2 选择器
2010/01/22 Javascript
js截取函数(indexOf,join等)
2010/09/01 Javascript
javascript 拖动表格行实现代码
2011/05/05 Javascript
深入理解JavaScript系列(14) 作用域链介绍(Scope Chain)
2012/04/12 Javascript
页面载入结束自动调用js函数示例
2013/09/23 Javascript
jquery实现多行文字图片滚动效果示例代码
2014/10/10 Javascript
jquery图片播放浏览插件prettyPhoto使用详解
2014/12/19 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
2016/06/23 Javascript
jQuery实现的超链接提示效果示例【附demo源码下载】
2016/09/09 Javascript
vue2.x+webpack快速搭建前端项目框架详解
2017/11/30 Javascript
vue-cli创建的项目,配置多页面的实现方法
2018/03/15 Javascript
在Python的Flask框架中使用模版的入门教程
2015/04/20 Python
Python中shape计算矩阵的方法示例
2017/04/21 Python
python+matplotlib绘制3D条形图实例代码
2018/01/17 Python
用Python画一个LinkinPark的logo代码实例
2019/09/10 Python
淘宝秒杀python脚本 扫码登录版
2019/09/19 Python
python3 自动打印出最新版本执行的mysql2redis实例
2020/04/09 Python
scrapy处理python爬虫调度详解
2020/11/23 Python
python实现计算器简易版
2020/12/17 Python
python 利用matplotlib在3D空间绘制二次抛物面的案例
2021/02/06 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
土耳其时尚潮流在线购物网站:Trendyol
2017/10/10 全球购物
公司市场部岗位职责
2013/12/02 职场文书
腾讯广告词
2014/03/19 职场文书
岗位标兵事迹材料
2014/05/17 职场文书
推广普通话标语
2014/06/27 职场文书
三孔导游词
2015/02/05 职场文书
社区青年志愿者活动总结
2015/05/06 职场文书
导游词之日本富士山
2020/01/06 职场文书
2022新作动画《福星小子》释出宣传影片 加入内田真礼&宫野真守配音演出
2022/04/08 日漫