本文实例讲述了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数据结构与算法之链表定义与用法实例详解【单链表、循环链表】...相关推荐

  1. python 3d绘图平面_python 用 matplotlib 在 3D 空间中绘制平面 实例详解

    #创建画布 fig = plt.figure(figsize=(12, 8), facecolor='lightyellow')#创建 3D 坐标系 ax = fig.gca(fc='whitesmo ...

  2. python中symbols函数用法_Python基础之函数用法实例详解

    本文以实例形式较为详细的讲述了Python函数的用法,对于初学Python的朋友有不错的借鉴价值.分享给大家供大家参考之用.具体分析如下: 通常来说,Python的函数是由一个新的语句编写,即def, ...

  3. python编程字典100例_python中字典(Dictionary)用法实例详解

    本文实例讲述了python中字典(Dictionary)用法.分享给大家供大家参考.具体分析如下: 字典(Dictionary)是一种映射结构的数据类型,由无序的"键-值对"组成. ...

  4. python的scatter函数_python scatter函数用法实例详解

    这篇文章主要介绍了python scatter函数用法实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数功能:寻找变量之间的关系. 调用签 ...

  5. java二分查找法_java算法之二分查找法的实例详解

    java算法之二分查找法的实例详解 原理 假定查找范围为一个有序数组(如升序排列),要从中查找某一元素,如果该元素在此数组中,则返回其索引,否则返回-1.通过数组长度可取出中间位置元素的索引,将其值与 ...

  6. python网上批量下载表格_python爬虫智能翻页批量下载文件的实例详解

    python爬虫遇到爬取文件内容时,需要一页页的翻页爬取,这样很是麻烦,其实可以获取每个列表信息下的文件名和文件链接,让文件名和文件链接处理为列表,保存后下载,实现智能翻页批量下载文件,本文以以京客隆 ...

  7. python中quad_python用quad、dblquad实现一维二维积分的实例详解

    背景: python函数库scipy的quad.dblquad实现一维二维积分的范例.需要注意dblquad的积分顺序问题. 代码: import numpy as np from scipy imp ...

  8. python递归编程题_Python数据结构与算法41:递归编程练习题4:铺瓷砖

    注:本文如涉及到代码,均经过Python 3.7实际运行检验,保证其严谨性. 本文阅读时间约为8分钟. 递归编程练习题4:铺瓷砖 给定一个长度为N的区域,及4种不同长度的瓷砖:灰瓷砖(长为1格).红瓷 ...

  9. java递归单链表查找中间元素_《数据结构与算法——C语言描述》答案 3.11 查找单链表中的特定元素(递归)...

    转载请注明出处:http://blog.csdn.net/xdz78 #include #include //查找单链表中的特定元素,<数据结构与算法--c语言描述> 3.11 答案 in ...

最新文章

  1. 微生物所科学家建成小鼠肠道微生物资源库
  2. linux服务器升级 需要什么,linux服务器升级node版本
  3. python 多维数组(array)排序
  4. OVS端口镜像(十四)
  5. 用python pandas三行代码实现excel转csv
  6. 【Fibonacci-PEG,LDPC】基于Fibonacci-PEG算法的LDPC码校验矩阵的构造
  7. 4.空悬指针和野指针
  8. moco-globalsettings
  9. Redis命令——键(key)
  10. Good Bye 2021: 2022 is NEAR A-Integer Diversity(水题)
  11. MapXtreme开发(二)
  12. ionic 集成websocket
  13. python手机端编程环境_Python + Appium 环境搭建
  14. 一文了解linux内核,一文了解Linux的系统结构
  15. 利用栈将html源码解析为节点树
  16. idea 自动添加doc_公共组件需求自动录入TAPD
  17. I.MX6 make menuconfig进入x86模式
  18. 调查丨融资企业数量不如出台政策多,产业区块链破局路在何方?
  19. 阿里云服务器配置redis5
  20. 再谈js拖拽(二)仿iGoogle自定义首页模块拖拽

热门文章

  1. 承载千万级并发的分布式系统架构设计思想
  2. android Button 监听的几种方式
  3. OpenCV3图像处理——霍夫曼变换直线检测
  4. 无法启动程序,因为计算机中丢失msvcr.dll
  5. 出现opencv error: assertion failed..........错误时, 一步解决
  6. mixly编程怎样音乐_华人留学生开发首个古汉语编程语言,实现易经算命、圆周率计算,Github获赞14.7k...
  7. boost avplayer
  8. 有多少种方法能把足球移出边界 Out of Boundary Paths
  9. 从源码编译InfluxDB
  10. IntelliJ IDEA删除所有断点