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中使用sys模板和logging模块获取行号和函数名的方法
Apr 15 Python
python计算时间差的方法
May 20 Python
python绘制双柱形图代码实例
Dec 14 Python
快速解决pandas.read_csv()乱码的问题
Jun 15 Python
django连接mysql配置方法总结(推荐)
Aug 18 Python
python爬虫实现中英翻译词典
Jun 25 Python
python+opencv像素的加减和加权操作的实现
Jul 14 Python
TensorFlow梯度求解tf.gradients实例
Feb 04 Python
详解python内置常用高阶函数(列出了5个常用的)
Feb 21 Python
keras的三种模型实现与区别说明
Jul 03 Python
如何以Winsows Service方式运行JupyterLab
Aug 30 Python
Django实现在线无水印抖音视频下载(附源码及地址)
May 06 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 读取文件的正确方法
2009/04/29 PHP
PHP 导出数据到淘宝助手CSV的方法分享
2010/02/27 PHP
smarty 缓存控制前的页面静态化原理
2013/03/15 PHP
浅谈使用PHP开发微信支付的流程
2015/10/04 PHP
关于PHP通用返回值设置方法
2017/03/31 PHP
PHP-CGI远程代码执行漏洞分析与防范
2017/05/07 PHP
在你的网页中嵌入外部网页的方法
2007/04/02 Javascript
JavaScript小技巧 2.5 则
2010/09/12 Javascript
javascript阻止浏览器后退事件防止误操作清空表单
2013/11/22 Javascript
js函数参数设置默认值的一种变通实现方法
2014/05/26 Javascript
Node.js 的异步 IO 性能探讨
2014/10/08 Javascript
js实现双击图片放大单击缩小的方法
2015/02/17 Javascript
原生js仿jquery animate动画效果
2016/07/13 Javascript
各式各样的导航条效果css3结合jquery代码实现
2016/09/17 Javascript
Radio 单选JS动态添加的选项onchange事件无效的解决方法
2016/12/12 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
详解如何为你的angular app构建一个第三方库
2018/12/07 Javascript
vue实现鼠标移入移出事件代码实例
2019/03/27 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
微信小程序实现点击页面出现文字
2020/09/21 Javascript
tensorflow中next_batch的具体使用
2018/02/02 Python
python kmeans聚类简单介绍和实现代码
2018/02/23 Python
python如何制作英文字典
2019/06/25 Python
python实现AHP算法的方法实例(层次分析法)
2020/09/09 Python
Python爬虫分析微博热搜关键词的实现代码
2021/02/22 Python
CSS3 Flex 弹性布局实例代码详解
2018/11/01 HTML / CSS
Html5 postMessage实现跨域消息传递
2016/03/11 HTML / CSS
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
Ejb技术面试题
2015/04/29 面试题
2014年学生会工作总结范文
2014/11/07 职场文书
办公用房租赁协议书
2014/11/29 职场文书
检讨书模板
2015/01/29 职场文书
冲出亚马逊观后感
2015/06/03 职场文书
中学团支部工作总结
2015/08/13 职场文书
关于做家务的心得体会
2016/01/23 职场文书