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实现扫描端口示例
Mar 29 Python
Python Tkinter基础控件用法
Sep 03 Python
Python机器学习库scikit-learn安装与基本使用教程
Jun 25 Python
opencv python 图像去噪的实现方法
Aug 31 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
布隆过滤器的概述及Python实现方法
Dec 08 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
Mar 06 Python
python模拟斗地主发牌
Apr 22 Python
python模拟实现分发扑克牌
Apr 22 Python
python上下文管理的使用场景实例讲解
Mar 03 Python
python第三方网页解析器 lxml 扩展库与 xpath 的使用方法
Apr 06 Python
python单元测试之pytest的使用
Jun 07 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
CI映射(加载)数据到view层的方法
2016/03/28 PHP
php+ajax+json 详解及实例代码
2016/12/12 PHP
微信公众平台开发教程⑥ 微信开发集成类的使用图文详解
2019/04/10 PHP
PHP实现的微信公众号扫码模拟登录功能示例
2019/05/30 PHP
Referer原理与图片防盗链实现方法详解
2019/07/03 PHP
IE浏览器PNG图片透明效果代码
2008/09/02 Javascript
Ruffy javascript 学习笔记
2009/11/30 Javascript
根据对象的某一属性进行排序的js代码(如:name,age)
2010/08/10 Javascript
网页前端优化之滚动延时加载图片示例
2013/07/13 Javascript
js替代copy(示例代码)
2013/11/27 Javascript
jQuery的DOM操作之删除节点示例
2014/01/03 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
基于Bootstrap的UI扩展 StyleBootstrap
2016/06/17 Javascript
关于JavaScript中forEach和each用法浅析
2017/07/27 Javascript
把JavaScript代码改成ES6语法不完全指南(分享)
2017/09/10 Javascript
基于Vue实现关键词实时搜索高亮显示关键词
2018/07/21 Javascript
用WebStorm进行Angularjs 2开发(环境篇:Windows 10,Angular-cli方式)
2018/12/05 Javascript
vue-router路由模式详解(小结)
2019/08/26 Javascript
layui table 表格模板按钮的实例代码
2019/09/21 Javascript
详解钉钉小程序组件之自定义模态框(弹窗封装实现)
2020/03/07 Javascript
vue动态设置页面title的方法实例
2020/08/23 Javascript
详解Vue 的异常处理机制
2020/11/30 Vue.js
Python配置文件解析模块ConfigParser使用实例
2015/04/13 Python
Linux中Python 环境软件包安装步骤
2016/03/31 Python
Python简单删除列表中相同元素的方法示例
2017/06/12 Python
在python中使用正则表达式查找可嵌套字符串组
2017/10/24 Python
python将一个英文语句以单词为单位逆序排放的方法
2018/12/20 Python
Python 中Django安装和使用教程详解
2019/07/03 Python
在python中,使用scatter绘制散点图的实例
2019/07/03 Python
TensorFlow tensor的拼接实例
2020/01/19 Python
哄娃神器4moms商店:美国婴童用品品牌
2019/03/07 全球购物
意大利奢侈品综合电商网站:MODES
2019/12/14 全球购物
公司投资建议书
2014/05/16 职场文书
三方股东合作协议书
2014/10/28 职场文书
物业管理交接协议书
2016/03/24 职场文书
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android