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的Urllib库的一些高级用法
Apr 30 Python
Python在Console下显示文本进度条的方法
Feb 14 Python
Python文件操作,open读写文件,追加文本内容实例
Dec 14 Python
matplotlib作图添加表格实例代码
Jan 23 Python
Python最小二乘法矩阵
Jan 02 Python
Python 从一个文件中调用另一个文件的类方法
Jan 10 Python
python 利用文件锁单例执行脚本的方法
Feb 19 Python
Python当中的array数组对象实例详解
Jun 12 Python
python读写csv文件实例代码
Jul 05 Python
python实现程序重启和系统重启方式
Apr 16 Python
Python中无限循环需要什么条件
May 27 Python
python动态规划算法实例详解
Nov 22 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
MVC模式的PHP实现
2006/10/09 PHP
php 生成静态页面的办法与实现代码详细版
2010/02/15 PHP
WordPress中重置文章循环的rewind_posts()函数讲解
2016/01/11 PHP
利用Homestead快速运行一个Laravel项目的方法详解
2017/11/14 PHP
如何在Laravel之外使用illuminate组件详解
2020/09/20 PHP
js对象之JS入门之Array对象操作小结
2011/01/09 Javascript
jQuery把表单元素变为json对象
2013/11/06 Javascript
父节点获取子节点的字符串示例代码
2014/02/26 Javascript
jQuery Mobile框架中的表单组件基础使用教程
2016/05/17 Javascript
jQuery hover事件简单实现同时绑定2个方法
2016/06/07 Javascript
jquery模拟多级复选框效果的简单实例
2016/06/08 Javascript
js鼠标跟随运动效果
2017/03/11 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
在angularJs中进行数据遍历的2种方法
2018/10/08 Javascript
vue项目在线上服务器访问失败原因分析
2020/08/14 Javascript
Python实现excel转sqlite的方法
2017/07/17 Python
Python 16进制与中文相互转换的实现方法
2018/07/09 Python
python3实现斐波那契数列(4种方法)
2019/07/15 Python
pytorch 共享参数的示例
2019/08/17 Python
python数据类型之间怎么转换技巧分享
2019/08/20 Python
python线程安全及多进程多线程实现方法详解
2019/09/27 Python
django框架cookie和session用法实例详解
2019/12/10 Python
python tkinter 设置窗口大小不可缩放实例
2020/03/04 Python
Python环境管理virtualenv&virtualenvwrapper的配置详解
2020/07/01 Python
Selenium结合BeautifulSoup4编写简单的python爬虫
2020/11/06 Python
澳大利亚领先的在线礼品网站:Gifts Australia
2020/08/15 全球购物
《东方明珠》教学反思
2014/04/20 职场文书
建筑安全标语
2014/06/07 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
房屋租赁合同协议书范本
2014/10/19 职场文书
初中优秀学生评语
2014/12/29 职场文书
护士求职自荐信范文
2015/03/04 职场文书
创建文明城市倡议书
2015/04/28 职场文书
汉语拼音教学反思
2016/02/22 职场文书
婚前协议书怎么写,才具有法律效力呢 ?
2019/06/28 职场文书
NGINX 权限控制文件预览和下载的实现原理
2022/01/18 Servers