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程序设计入门(3)数组的使用
Jun 16 Python
Python的Django框架中的URL配置与松耦合
Jul 15 Python
python数组过滤实现方法
Jul 27 Python
Python实现统计文本文件字数的方法
May 05 Python
Python数据结构与算法之二叉树结构定义与遍历方法详解
Dec 12 Python
Python使用 Beanstalkd 做异步任务处理的方法
Apr 24 Python
让代码变得更易维护的7个Python库
Oct 09 Python
python实现多进程代码示例
Oct 31 Python
pygame实现雷电游戏雏形开发
Nov 20 Python
Linux下升级安装python3.8并配置pip及yum的教程
Jan 02 Python
什么是Python变量作用域
Jun 03 Python
使用Python判断一个文件是否被占用的方法教程
Dec 16 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编程效率的方法
2013/11/07 PHP
PHP实现对文本数据库的常用操作方法实例演示
2014/07/04 PHP
smarty简单入门实例
2014/11/28 PHP
php+mysql实现简单登录注册修改密码网页
2016/11/30 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
浅谈php的TS和NTS的区别
2019/03/13 PHP
JavaScript 学习笔记二 字符串拼接
2010/03/28 Javascript
完美解决IE低版本不支持call与apply的问题
2013/12/05 Javascript
JQuery判断HTML元素是否存在的两种解决方法
2013/12/26 Javascript
jquery图片切换插件
2015/03/16 Javascript
cocos creator Touch事件应用(触控选择多个子节点的实例)
2017/09/10 Javascript
微信小程序仿RadioGroup改变样式的处理方案
2018/07/13 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
JavaScript生成一个不重复的ID的方法示例
2019/09/16 Javascript
JS 遍历 json 和 JQuery 遍历json操作完整示例
2019/11/11 jQuery
[00:15]TI9观赛名额抽取
2019/07/10 DOTA
python生成器的使用方法
2013/11/21 Python
pyqt4教程之widget使用示例分享
2014/03/07 Python
Python多线程结合队列下载百度音乐的方法
2015/07/27 Python
tensorflow1.0学习之模型的保存与恢复(Saver)
2018/04/23 Python
python用pandas数据加载、存储与文件格式的实例
2018/12/07 Python
浅析python的Lambda表达式
2019/02/27 Python
django框架forms组件用法实例详解
2019/12/10 Python
Python使用Pyqt5实现简易浏览器(最新版本测试过)
2020/04/27 Python
解决Pytorch自定义层出现多Variable共享内存错误问题
2020/06/28 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
德国网上宠物店:Zoobio
2018/05/23 全球购物
工业设计专业个人求职信范文
2013/12/28 职场文书
元旦晚会邀请函
2014/01/27 职场文书
干部下基层实施方案
2014/03/14 职场文书
母校寄语大全
2014/04/10 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
python 中[0]*2与0*2的区别说明
2021/05/10 Python
Redis主从配置和底层实现原理解析(实战记录)
2021/06/30 Redis
面试被问select......for update会锁表还是锁行
2021/11/11 MySQL
2021好看的国漫排行榜前十名 《完美世界》上榜,《元龙》排名第一
2022/03/18 国漫