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实现短网址ShortUrl的Hash运算实例讲解
Aug 10 Python
Unicode和Python的中文处理
Mar 19 Python
Django自定义分页效果
Jun 27 Python
Python使用getpass库读取密码的示例
Oct 10 Python
python中pylint使用方法(pylint代码检查)
Apr 06 Python
详解Django的model查询操作与查询性能优化
Oct 16 Python
python多进程控制学习小结
Oct 31 Python
python中partial()基础用法说明
Dec 30 Python
Python基于scipy实现信号滤波功能
May 08 Python
计算机二级python学习教程(1) 教大家如何学习python
May 16 Python
如何使用python传入不确定个数参数
Feb 18 Python
Python如何合并多个字典或映射
Jul 24 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
IIS下配置Php+Mysql+zend的图文教程
2006/12/08 PHP
php htmlspecialchars加强版
2010/02/16 PHP
PHP跨时区(UTC时间)应用解决方案
2013/01/11 PHP
PHP循环输出指定目录下的所有文件和文件夹路径例子(简单实用)
2014/05/10 PHP
php 5.6版本中编写一个PHP扩展的简单示例
2015/01/20 PHP
php对象和数组相互转换的方法
2015/05/12 PHP
使用phpstorm和xdebug实现远程调试的方法
2015/12/29 PHP
jquery表格内容筛选实现思路及代码
2013/04/16 Javascript
Jquery实现列表(隔行换色,全选,鼠标滑过当前行)效果实例
2013/06/09 Javascript
js利用数组length属性清空和截短数组的小例子
2014/01/15 Javascript
用jQuery的AJax实现异步访问、异步加载
2016/11/02 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
js实现图片粘贴上传到服务器并展示的实例
2017/11/08 Javascript
关于AngularJS中ng-repeat不更新视图的解决方法
2018/09/30 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
JavaScript 事件代理需要注意的地方
2020/09/08 Javascript
django中media媒体路径设置的步骤
2019/11/15 Python
python实现发送带附件的邮件代码分享
2020/09/22 Python
Python利用myqr库创建自己的二维码
2020/11/24 Python
python Scrapy爬虫框架的使用
2021/01/21 Python
单位单身证明范本
2014/01/11 职场文书
个人自我评价和职业目标
2014/01/24 职场文书
技能竞赛活动方案
2014/02/21 职场文书
工艺工程师岗位职责
2014/03/04 职场文书
外语专业毕业生自荐信
2014/04/14 职场文书
电子专业求职信
2014/06/19 职场文书
2014年重阳节老干部座谈会上的讲话稿
2014/09/25 职场文书
领导班子群众路线与四风问题对照检查材料思想汇报
2014/10/11 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
大学生求职自荐信
2015/03/24 职场文书
保送生自荐信范文
2015/03/26 职场文书
党员干部廉洁自律承诺书
2015/04/28 职场文书
高中班长竞选稿
2015/11/20 职场文书