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多线程实例教程
Sep 06 Python
浅谈插入排序算法在Python程序中的实现及简单改进
May 04 Python
Python 爬虫学习笔记之单线程爬虫
Sep 21 Python
Python实现购物程序思路及代码
Jul 24 Python
python实现二叉查找树实例代码
Feb 08 Python
儿童学习python的一些小技巧
May 27 Python
Sanic框架蓝图用法实例分析
Jul 17 Python
Python实现八皇后问题示例代码
Dec 09 Python
python 获取等间隔的数组实例
Jul 04 Python
python 定义类时,实现内部方法的互相调用
Dec 25 Python
python计算导数并绘图的实例
Feb 29 Python
使用python把xmind转换成excel测试用例的实现代码
Oct 12 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
APMServ使用说明
2006/10/23 PHP
浅析PHP水印技术
2007/02/14 PHP
php smarty的预保留变量总结
2008/12/04 PHP
叫你如何修改Nginx与PHP的文件上传大小限制
2014/09/10 PHP
php从memcache读取数据再批量写入mysql的方法
2014/12/29 PHP
php cookie用户登录的详解及实例代码
2017/01/03 PHP
JS获取文本框,下拉框,单选框的值的简单实例
2014/02/26 Javascript
让checkbox不选中即将选中的checkbox不选中
2014/07/11 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
angular-cli修改端口号【angular2】
2017/04/19 Javascript
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
js登录滑动验证的实现(不滑动无法登陆)
2018/01/03 Javascript
微信小程序生成分享海报方法(附带二维码生成)
2019/03/29 Javascript
vue实现路由懒加载的3种方法示例
2020/09/01 Javascript
[03:44]2015国际邀请赛选手档案—Cloud9.NoTail
2015/07/28 DOTA
学习python (2)
2006/10/31 Python
python获取豆瓣电影简介代码分享
2014/01/16 Python
在Python中调用ggplot的三种方法
2015/04/08 Python
Python中的super用法详解
2015/05/28 Python
编写Python爬虫抓取暴走漫画上gif图片的实例分享
2016/04/20 Python
Python多线程中阻塞(join)与锁(Lock)使用误区解析
2018/04/27 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
Python Pywavelet 小波阈值实例
2019/01/09 Python
linux查找当前python解释器的位置方法
2019/02/20 Python
pandas.read_csv参数详解(小结)
2019/06/21 Python
Python下opencv图像阈值处理的使用笔记
2019/08/04 Python
python with (as)语句实例详解
2020/02/04 Python
CSS3 display知识详解
2015/11/25 HTML / CSS
中学劳技课教师的自我评价
2014/02/05 职场文书
小小的船教学反思
2014/02/21 职场文书
厨房领班竞聘演讲稿
2014/04/23 职场文书
学习雷锋精神演讲稿
2014/05/10 职场文书
小学生读书笔记
2015/07/01 职场文书
《詹天佑》教学反思
2016/02/20 职场文书
《草船借箭》教学反思
2016/02/23 职场文书
关于JavaScript轮播图的实现
2021/11/20 Javascript