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之入门(三)序列
May 25 Python
python获取本机外网ip的方法
Apr 15 Python
python常用函数详解
Sep 13 Python
使用pandas模块读取csv文件和excel表格,并用matplotlib画图的方法
Jun 22 Python
Opencv实现抠图背景图替换功能
May 21 Python
详解pandas中MultiIndex和对象实际索引不一致问题
Jul 23 Python
详细介绍Python进度条tqdm的使用
Jul 31 Python
对pytorch中的梯度更新方法详解
Aug 20 Python
python @propert装饰器使用方法原理解析
Dec 25 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
哪种Python框架适合你?简单介绍几种主流Python框架
Aug 04 Python
Python面向对象之成员相关知识总结
Jun 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
解析php中eclipse 用空格替换 tab键
2013/06/24 PHP
win7下memCache的安装过程(具体操作步骤)
2013/06/28 PHP
destoon供应信息title调用出公司名称的方法
2014/08/22 PHP
php实现基于pdo的事务处理方法示例
2017/07/21 PHP
实例解析php的数据类型
2018/10/24 PHP
Js中setTimeout()和setInterval() 何时被调用执行的用法
2013/04/12 Javascript
php 中序列化和json使用介绍
2013/07/08 Javascript
jquery 实现密码框的显示与隐藏示例代码
2013/09/18 Javascript
JavaScript保留两位小数的2个自定义函数
2014/05/05 Javascript
推荐JavaScript实现继承的最佳方式
2014/11/11 Javascript
Laravel中常见的错误与解决方法小结
2016/08/30 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
使用Javascript监控前端相关数据的代码
2016/10/27 Javascript
vue.js在标签属性中插入变量参数的方法
2018/03/06 Javascript
详解extract-text-webpack-plugin 的使用及安装
2018/06/12 Javascript
node.js爬取中关村的在线电瓶车信息
2018/11/13 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
微信小程序获取复选框全选反选选中的值(实例代码)
2019/12/17 Javascript
JS实现星星海特效
2019/12/24 Javascript
Node.js实现批量下载图片简单操作示例
2020/01/18 Javascript
JS删除数组指定值常用方法详解
2020/06/04 Javascript
手写Vue源码之数据劫持示例详解
2021/01/04 Vue.js
Python类方法__init__和__del__构造、析构过程分析
2015/03/06 Python
linux下python抓屏实现方法
2015/05/22 Python
Python面向对象之反射/自省机制实例分析
2018/08/24 Python
Python中print和return的作用及区别解析
2019/05/05 Python
python中数组和矩阵乘法及使用总结(推荐)
2019/05/18 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python实现上传文件到linux指定目录的方法
2020/01/03 Python
关于python中的xpath解析定位
2020/03/06 Python
Python面向对象特殊属性及方法解析
2020/09/16 Python
HTML5给汉字加拼音收起展开组件的实现代码
2020/04/08 HTML / CSS
通往英国高街的商店橱窗:Down Your High Street
2020/07/19 全球购物
小学德育工作总结2015
2015/05/12 职场文书
解决MySQL添加新用户-ERROR 1045 (28000)的问题
2022/03/03 MySQL
MySQL存储过程及语法详解
2022/08/05 MySQL