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 元类使用说明
Dec 18 Python
python多线程编程中的join函数使用心得
Sep 02 Python
PHP网页抓取之抓取百度贴吧邮箱数据代码分享
Apr 13 Python
Python实现简单的获取图片爬虫功能示例
Jul 12 Python
django站点管理详解
Dec 12 Python
pytorch对可变长度序列的处理方法详解
Dec 08 Python
python将list转为matrix的方法
Dec 12 Python
Python和Java的语法对比分析语法简洁上python的确完美胜出
May 10 Python
使用Python-OpenCV向图片添加噪声的实现(高斯噪声、椒盐噪声)
May 28 Python
Pandas DataFrame中的tuple元素遍历的实现
Oct 23 Python
calendar在python3时间中常用函数举例详解
Nov 18 Python
OpenCV3.3+Python3.6实现图片高斯模糊
May 18 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
咖啡常见的种类
2021/03/03 新手入门
利用PHP实现短域名互转
2013/07/05 PHP
PHP定时任务获取微信access_token的方法
2016/10/10 PHP
javascript日期转换 时间戳转日期格式
2011/11/05 Javascript
Js 时间函数getYear()的使用问题探讨
2013/04/01 Javascript
jquery获取div距离窗口和父级dv的距离示例
2013/10/10 Javascript
jQuery实现复选框全选/取消全选/反选及获得选择的值
2014/06/12 Javascript
JavaScript使用二分查找算法在数组中查找数据的方法
2015/04/07 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
详解JavaScript中的Unescape()和String() 函数
2015/11/09 Javascript
详解jQuery UI库中文本输入自动补全功能的用法
2016/04/23 Javascript
ES6深入理解之“let”能替代”var“吗?
2017/06/28 Javascript
Javascript实现基本运算器
2017/07/15 Javascript
webpack打包js文件及部署的实现方法
2017/12/18 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
微信小程序后台持续定位功能使用详解
2019/08/23 Javascript
JS计算斐波拉切代码实例
2019/09/12 Javascript
vue-router结合vuex实现用户权限控制功能
2019/11/14 Javascript
js+canvas实现刮刮奖功能
2020/09/13 Javascript
Python random模块(获取随机数)常用方法和使用例子
2014/05/13 Python
基于Python的关键字监控及告警
2017/07/06 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
python实现SOM算法
2018/02/23 Python
python程序运行进程、使用时间、剩余时间显示功能的实现代码
2019/07/11 Python
Django框架模型简单介绍与使用分析
2019/07/18 Python
python 的 openpyxl模块 读取 Excel文件的方法
2019/09/09 Python
Python经纬度坐标转换为距离及角度的实现
2020/11/01 Python
CSS的background属性及CSS3的背景图片设置总结
2016/06/13 HTML / CSS
德国汉莎航空中国官网: Lufthansa中国
2017/03/30 全球购物
全球异乡人的跨境社交电商平台:Kouhigh口嗨网
2020/07/24 全球购物
应届生会计电算化求职信
2013/10/03 职场文书
高考自主招生自荐信
2013/10/20 职场文书
大学生实习证明范本
2014/01/15 职场文书
各营销点岗位职责范本
2014/03/05 职场文书
教师节标语大全
2014/10/07 职场文书
房屋质量投诉书
2015/07/02 职场文书