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 相关文章推荐
用tensorflow实现弹性网络回归算法
Jan 09 Python
python获取酷狗音乐top500的下载地址 MP3格式
Apr 17 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
使用Python制作自动推送微信消息提醒的备忘录功能
Sep 06 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
Python函数中的可变长参数详解
Sep 12 Python
python 实现turtle画图并导出图片格式的文件
Dec 07 Python
Python tkinter和exe打包的方法
Feb 05 Python
Python使用type动态创建类操作示例
Feb 29 Python
完美解决jupyter由于无法import新包的问题
May 26 Python
pytorch 如何使用float64训练
May 24 Python
python自动化八大定位元素讲解
Jul 09 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
程序员编程十条戒律
2009/07/09 PHP
php和js如何通过json互相传递数据相关问题探讨
2013/02/26 PHP
PHP链表操作简单示例
2016/10/15 PHP
PHP foreach遍历多维数组实现方式
2016/11/16 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
php apache开启跨域模式过程详解
2019/07/08 PHP
InnerHtml和InnerText的区别分析
2009/03/13 Javascript
Document 对象的常用方法
2009/07/31 Javascript
JavaScript Event学习第五章 高级事件注册模型
2010/02/07 Javascript
javascript cookies 设置、读取、删除实例代码
2010/04/12 Javascript
自己写的兼容ie和ff的在线文本编辑器类似ewebeditor
2012/12/12 Javascript
jquery动态调整div大小使其宽度始终为浏览器宽度
2014/06/06 Javascript
对比分析AngularJS中的$http.post与jQuery.post的区别
2015/02/27 Javascript
js兼容pc端浏览器并有多种弹出小提示的手机端浮层控件实例
2015/04/29 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
jquery分页插件jquery.pagination.js实现无刷新分页
2016/04/01 Javascript
AngularJS基础 ng-mousemove 指令简单示例
2016/08/02 Javascript
JS检测window.open打开的窗口是否关闭
2017/06/25 Javascript
React教程之封装一个Portal可复用组件的方法
2018/01/02 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
解决Vue的项目使用Element ui 走马灯无法实现的问题
2020/08/03 Javascript
[01:07:19]DOTA2-DPC中国联赛 正赛 CDEC vs XG BO3 第一场 1月19日
2021/03/11 DOTA
深入讲解Python编程中的字符串
2015/10/14 Python
CentOS 6.X系统下升级Python2.6到Python2.7 的方法
2016/10/12 Python
Python中强大的命令行库click入门教程
2016/12/26 Python
pyspark 随机森林的实现
2020/04/24 Python
PyChon中关于Jekins的详细安装(推荐)
2020/12/28 Python
Aerosoles爱柔仕官网:美国舒软女鞋品牌
2017/07/17 全球购物
英国最大的汽车配件在线商店:Euro Car Parts
2019/09/30 全球购物
浙大网新C/C++面试解惑
2015/05/27 面试题
一百多行代码实现react拖拽hooks
2021/03/23 Javascript
圣诞节红领巾广播稿
2014/02/03 职场文书
小学教师个人先进事迹材料
2014/05/17 职场文书
实习生工作证明范本
2014/09/14 职场文书
党员民主评议总结
2014/10/20 职场文书
Python学习之时间包使用教程详解
2022/03/21 Python