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 08 Python
Java编程迭代地删除文件夹及其下的所有文件实例
Feb 10 Python
Python装饰器的执行过程实例分析
Jun 04 Python
python寻找list中最大值、最小值并返回其所在位置的方法
Jun 27 Python
python添加模块搜索路径和包的导入方法
Jan 19 Python
Python3实现的判断回文链表算法示例
Mar 08 Python
python实现beta分布概率密度函数的方法
Jul 08 Python
DataFrame.to_excel多次写入不同Sheet的实例
Dec 02 Python
python3将变量写入SQL语句的实现方式
Mar 02 Python
Python QT组件库qtwidgets的使用
Nov 02 Python
pycharm 实现光标快速移动到括号外或行尾的操作
Feb 05 Python
Python中使用Lambda函数的5种用法
Apr 01 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截取中文字符串函数实例
2015/02/23 PHP
Symfony2框架创建项目与模板设置实例详解
2016/03/17 PHP
<script defer> defer 是什么意思
2009/05/10 Javascript
修改好的jquery滚动字幕效果实现代码
2011/06/22 Javascript
js自定义事件及事件交互原理概述(一)
2013/02/01 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
JS实现IE状态栏文字缩放效果代码
2015/10/24 Javascript
浅谈JavaScript的闭包函数
2016/12/08 Javascript
浅谈Vue-cli 命令行工具分析
2017/11/22 Javascript
JavaScript复制内容到剪贴板的两种常用方法
2018/02/27 Javascript
jQuery AJAX 方法success()后台传来的4种数据详解
2018/08/08 jQuery
Electron 如何调用本地模块的方法
2019/02/01 Javascript
Vue实现商品详情页的评价列表功能
2019/09/04 Javascript
浅谈layui 数据表格前后台传值的问题
2019/09/12 Javascript
node.js Promise对象的使用方法实例分析
2019/12/26 Javascript
vue修改Element的el-table样式的4种方法
2020/09/17 Javascript
[01:31](回顾)杀出重围,决战TI之巅
2014/07/01 DOTA
初学python数组的处理代码
2011/01/04 Python
django自定义Field实现一个字段存储以逗号分隔的字符串
2014/04/27 Python
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
python机器学习之决策树分类详解
2017/12/20 Python
python七夕浪漫表白源码
2019/04/05 Python
Python获取时间范围内日期列表和周列表的函数
2019/08/05 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
python利用递归方法实现求集合的幂集
2020/09/07 Python
HTML5通用接口详解
2016/06/12 HTML / CSS
canvas实现圆形进度条动画的示例代码
2017/12/26 HTML / CSS
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
通信工程毕业生自荐信
2013/11/01 职场文书
四群教育工作实施方案
2014/03/26 职场文书
优秀班主任推荐材料
2014/12/17 职场文书
《飘》英文读后感五篇
2019/10/11 职场文书
深入浅出讲解Java8函数式编程
2022/01/18 Java/Android
对讲机的最大通讯距离是多少
2022/02/18 无线电